C X L The C Programmer's Extended Function Library Version 5.1 September 1, 1989 by Mike Smedley Copyright (c) 1987-1989 All Rights Reserved Reference Manual Table of Contents Introduction................................1 General Information....................1 Features of the CXL Library............1 Registration Information...............3 How to Contact the Author..............6 Disclaimer.............................6 Trademarks.............................6 Using CXL Functions....................7 Global Variables............................8 _kbinfo................................8 _mouse.................................8 _vinfo.................................8 _winfo.................................9 Library Functions..........................11 attrib................................11 beep..................................11 biosver...............................11 box_..................................12 capsoff...............................12 capson................................13 cclrscrn..............................13 cgardbyte.............................13 cgardword.............................14 cgareadn..............................14 cgawrbyte.............................14 cgawriten.............................15 cgawrstr..............................15 cgawrword.............................16 chgonkey..............................16 clearkeys.............................17 clockcal..............................17 clreol_...............................17 clrscrn...............................18 clrwin................................18 cvaltype..............................18 cvtcf.................................19 cvtci.................................19 cvtfc.................................20 cvtic.................................20 cxlver................................21 delay_................................21 disktoscrn............................21 disktowin.............................22 EMS Functions.........................23 emsalloc..............................24 emsdealloc............................24 emsexist..............................25 emsframe..............................25 emsfree...............................25 emsmap................................26 emsread...............................26 emstotal..............................27 i emsver................................27 emswrite..............................27 expmem................................28 extmem................................28 fcrypt................................29 fill_.................................29 freonkey..............................30 gameport..............................30 getchf................................30 getcursz..............................31 getns.................................31 getxch................................32 gotoxy_...............................32 hidecur...............................33 inputsf...............................33 kbclear...............................34 kbmhit................................34 kbput.................................34 kbputs................................35 kbstat................................36 lcrlf.................................36 lgcursor..............................36 lprintc...............................37 lprintf...............................37 lprintns..............................38 lprints...............................38 lprintsb..............................38 lprintsu..............................39 machid................................39 mapattr...............................40 mathchip..............................40 mode..................................40 msbclear..............................41 msbpress..............................41 msbreles..............................42 mscondoff.............................43 mscursor..............................43 msgotoxy..............................44 mshbounds.............................44 mshidecur.............................45 msinit................................45 msmotion..............................45 msshowcur.............................46 msspeed...............................46 msstatus..............................46 mssupport.............................47 msvbounds.............................48 numflop...............................48 numoff................................48 numon.................................49 numpar................................49 numser................................49 printc................................50 prints................................50 ii putchat...............................51 randfile..............................51 readchat..............................51 readcur...............................52 revattr...............................52 revsattr..............................53 scancode..............................53 scrndump..............................54 scrntodisk............................54 setattr...............................54 setcursz..............................55 setkbloop.............................55 setlines..............................56 setonkey..............................56 setvparam.............................57 showcur...............................57 smcursor..............................58 sound_................................58 spc...................................58 srestore..............................59 ssave.................................59 strblank..............................60 strbmatch.............................60 strbtrim..............................61 strchg................................61 strchksum.............................62 strcode...............................62 strdel................................63 strdela...............................63 strichg...............................64 strichksum............................64 stridel...............................65 stridela..............................65 striinc...............................66 strinc................................66 strins................................67 striocc...............................67 strischg..............................68 strisocc..............................69 strisrep..............................69 strleft...............................70 strljust..............................70 strltrim..............................71 strmatch..............................71 strmid................................72 strocc................................72 strright..............................73 strrjust..............................73 strrol................................74 strror................................74 strschg...............................75 strsetsz..............................75 strshl................................76 strshr................................77 iii strsocc...............................77 strsrep...............................78 strtrim...............................78 struplow..............................79 sysdate...............................79 systime...............................80 tabstop...............................80 timer.................................81 touplow...............................81 videoinit.............................82 vidmode...............................82 vidtype...............................83 wactiv................................83 waitkey...............................84 waitkeyt..............................84 wborder...............................85 wbox..................................85 wbprintc..............................86 wcclear...............................86 wcenters..............................87 wchgattr..............................87 wchkbox...............................88 wchkcol...............................88 wchkcoord.............................89 wchkrow...............................89 wclear................................90 wclose................................90 wcloseall.............................90 wclreol...............................91 wclreos...............................91 wcopy.................................91 wdelline..............................92 wdrag.................................93 wdump.................................93 wdupc.................................93 wdups.................................94 werrmsg...............................95 wfill.................................95 wfillch...............................96 wfindrec..............................96 wgetc.................................96 wgetchf...............................97 wgetns................................97 wgets.................................98 wgetyn................................99 wgotoxy...............................99 whandle..............................100 Context-Sensitive Help Functions.....100 whelpcat.............................102 whelpclr.............................103 whelpdef.............................103 whelpop..............................104 whelpopc.............................104 whelppcat............................105 iv whelpush.............................105 whelpushc............................105 whelpundef...........................106 whelpwin.............................106 whide................................107 whline...............................107 windowat.............................108 windump..............................109 Multi-Field Input Functions..........109 winpbeg..............................112 winpdef..............................113 winpfba..............................114 winpfcurr............................114 winpffind............................115 winpkey..............................115 winpread.............................116 winputsf.............................117 winsline.............................117 wintodisk............................118 wisactiv.............................118 Bar Menu Functions...................119 wmenubeg.............................120 wmenubegc............................121 wmenuend.............................122 wmenuget.............................123 wmenuiba.............................123 wmenuicurr...........................124 wmenuidsab...........................124 wmenuienab...........................125 wmenuifind...........................125 wmenuinext...........................126 wmenuitem............................126 wmenuitxt............................128 wmenumcurr...........................128 wmessage.............................129 wmove................................129 wopen................................130 wperror..............................131 wpgotoxy.............................131 wpickfile............................132 wpickstr.............................133 wprintc..............................134 wprintf..............................134 wprints..............................135 wprintsf.............................135 wputc................................136 wputns...............................137 wputs................................137 wputsw...............................138 wreadcur.............................138 wrestore.............................139 wrjusts..............................139 wsave................................140 wscanf...............................140 v wscroll..............................141 wscrollbox...........................141 wselstr..............................142 wsetesc..............................142 wshadoff.............................143 wshadow..............................143 wsize................................144 wslide...............................144 wtabwidth............................145 wtextattr............................145 wtitle...............................146 wunhide..............................146 wunlink..............................147 wvline...............................147 wwprints.............................148 Appendix A - Text Attribute Identifiers...150 Appendix B - Keycode Table................151 Appendix C - Window Output Escape Codes...153 Appendix D - Format Control Characters....154 Appendix E - Input Field Editing Keys.....157 vi Introduction General Information. The CXL library is intended to be a supplement to your C compiler's standard run-time library. It contains over 260 multi-purpose functions which provide a variety of capabilities. It is available for several popular C compilers including Microsoft C, QuickC, Turbo C, and Zortech C/C++. These routines were written in 99% highly-optimized C code ensuring maximum program speed, minimum program size, easy modification, and increased portability. This release is an evaluation release containing everything you need to write C programs using the small memory model. The libraries for the other memory models are supplied when you register. Features of the CXL Library. o Powerful windowing system. Allows as many open windows as memory permits. Windows can be stacked, tiled, shadowed, moved, resized, and changed in many other ways. There is a whole assortment of various input and output functions to interract with windows. o Multi-field formatted data entry. You can create data entry forms that consist of one or more input fields. You have full control over user input and can tie validation functions into each input field. Features alpha and numeric justification, capitalization conversion, formatting characters, and a large assortment of editing keys. o Moving bar menus. You can easily create pop-up, pull-down, and Lotus-style menus, as well as any other custom menu that you can define. Features full mouse support, nonselectable items, global hot keys, and more. o Scrollable pick menus. Allow you to pick one item from a list of items. Features full mouse support and scroll bars. There is also a dedicated file picker that uses this feature to let you pick from a list of files, very similar to the way that the Turbo C and QuickC environments' file pickers work. o Context-sensitive help system. Help files are indexed for speed. Help categories can be cross-referenced. Help can be applied at the global, window, menu item, and input field levels. o Several video output methods. These include direct screen writing, direct screen writing with CGA snow elimination, video BIOS writing, and DESQview video buffer writing. These will allow you to be video compatible with virtually any video adapter or multitasking environment. 1 o EGA 43 and VGA 50-line modes. CXL provides functions to directly change to and from these modes. CXL's video functions are also compatible with nonstandard modes such as 132x25 and 120x43. o Extensive mouse support. Mouse movements can be translated into keypresses, and several CXL functions have a "point-and-shoot" type of mouse support that utilizes a free-moving mouse cursor. There are also several functions for directly manipulating Microsoft-compatible mice. o Keyboard management routines. Allows you to tie keystrokes to functions, stuff and clear the keyboard buffer, set and read the keyboard shift/toggle keys, and specify a function to be called while waiting for a keypress. o Advanced string manipulation. There are a host of string manipulation functions that perform searching, replacing, formatting, conversion, rotating, shifting, pattern matching, encryption, and other string operations. o Several other functions for expanded memory (EMS) usage, file encryption, date and time formatting, equipment detection, printing, sound, and more. 2 Registration Information. CXL is distributed as User-Supported software. You are free to copy and distribute this software freely, however, if you find it of use to you, you are encouraged to register your copy. Registering your copy of the software helps the author continue to provide professional-quality software at very reasonable prices. The Basic Registration is $35.00 and includes the full library source code, one library disk of your choice, batch files to build and update the libraries, royalty-free use of library functions, unlimited technical support, and low-cost upgrades. Library disks contain all memory model libraries supported by your compiler. They are available for Microsoft C/QuickC, Turbo C, and Zortech C/C++. Since you will have the source code, you will be able to use it to build any of the libraries for the supported compilers. However, if you don't want to hassle with building libraries, pre-compiled library disks are available for an additional $5.00 each (one library disk is included in the Basic Registration). All materials are shipped on 5.25-inch floppy diskettes, however, there is a 3.5-inch floppy diskette service available for an additional $5.00. This is a once-per-order charge that covers as many 3.5-inch floppy disks as are needed to ship your order. Non-U.S. orders need to include $5.00 extra to cover additional shipping and handling charges. Checks and money orders must be drawn on a U.S. bank. Please send all payments payable in U.S. Dollars. Texas residents must add 8% for state sales tax. Print the registration form, REGISTER.DOC, or include on a piece of paper your name, address, phone number, and brand of compiler, and send it along with your payment to: Mike Smedley P.O. Box 33603 San Antonio, TX 78265-3603 If by chance, you don't have the REGISTER.DOC file, a copy of the registration form is included on the next page. 3 CXL REGISTRATION FORM NAME: ______________________________________________________ COMPANY: ______________________________________________________ ADDRESS: ______________________________________________________ ______________________________________________________ CITY: ______________________________________________________ STATE: ________________________ ZIP CODE: _________________ PHONE: ______________________________________________________ E-MAIL ADDRESS: _______________________________________________ WHERE DID YOU RECEIVE CXL? ____________________________________ ________________________________________________________________ COMMENTS: _____________________________________________________ ________________________________________________________________ Basic Registration @ $35.00 $__________ (Circle ONE library disk) Microsoft Turbo Zortech Additional Library Disks @ $5.00 Each __________ (Circle each ADDITIONAL library disk) Microsoft Turbo Zortech 3.5-Inch Floppy Disk Service @ $5.00 __________ (Covers entire order) Shipping outside U.S. @ $5.00 __________ (Payments MUST be in U.S. Dollars/U.S. Bank) SUBTOTAL: $__________ Texas Residents Add 8% State Sales Tax $35 = $2.80 | $40 = $3.20 | $45 = $3.60 __________ $50 = $4.00 | $55 = $4.40 | $60 = $4.80 5.1 TOTAL: $__________ Remit to: Mike Smedley P.O. Box 33603 San Antonio, TX 78265-3603 4 5 How to Contact the Author. Primary: CXL Tech Support BBS - (512) 590-0460 1200-14400 HST 8-N-1 Alternate: CompuServe - 71331,2244 GEnie - M.SMEDLEY U.S. Mail - Mike Smedley P.O. Box 33603 San Antonio, TX 78265-3603 Disclaimer. The author, Mike Smedley, claims no responsibility for any damages caused by the use or misuse of this product. This product is distributed "as is" with no warranty expressed or implied. The author will not be responsible for any losses incurred, either directly or indirectly, by the use of this product. Use this product entirely at your own risk. The author reserves the right to make modifications at any time. Prices are subject to change without notice. Trademarks. CompuServe is a registered trademark of CompuServe Incorporated. DESQview is a trademark of Quarterdeck Office Systems. Epson is a registered trademark of Seiko Epson Corporation. GEnie is a trademark of GE Information Services. IBM is a registered trademark of International Business Machines. LIM and EMS are trademarks of Lotus, Intel, and Microsoft Corporations. Lotus is a registered trademark of Lotus Development Corporation. Microsoft is a registered trademark of Microsoft Corporation. Turbo C is a registered trademark of Borland International. Zortech is a trademark of Zortech Inc. 6 Using CXL Functions. For every CXL function you use, there should be a corresponding CXL header file #included at the top of your program. The CXL header files should follow your standard compiler header files. For example: #include #include #include "cxldef.h" #include "cxlwin.h" The basic command line compiler/linker commands to build your file containing CXL functions are as follows: Microsoft C: cl myfile.c cxlmss.lib Quick C: qcl myfile.c cxlmss.lib Turbo C: tcc myfile.c cxltcs.lib Zortech C/C++: ztc myfile cxlzts.lib To use CXL from the Turbo C integrated environment (TC.EXE), you need to create a project file containing the name of the CXL library. You can call it MYFILE.PRJ and it can consist of just one line: myfile.c cxltcs.lib Then when you run TC.EXE, set the project file name to MYFILE.PRJ and press the Make key. 7 Global Variables NAME _kbinfo DESCRIPTION A record which holds keyboard information. The individual structure elements are: kbuf - pointer to head record in key buffer. onkey - pointer to head record in onkey list. kbloop - pointer to function to call while waiting for a keypress. This variable should be set with the setkbloop() function. inmenu - inmenu flag used internally by the menuing and picking functions to help control mouse support. source - source of last keypress. 0=keyboard, 1=key buffer, and 2=mouse key emulation. SYNOPSIS #include "cxlkey.h" struct _kbinfo_t _kbinfo; ------------------------------------------------------------------------ NAME _mouse DESCRIPTION This variable is set by the msinit() and/or mssupport() function. It contains MS_NONE by default. If msinit() detects a mouse, it will set _mouse to MS_KEYS. Also see the function descriptions of msinit() and mssupport(). SYNOPSIS #include "cxlmou.h" int _mouse; ------------------------------------------------------------------------ NAME _vinfo DESCRIPTION The video information record. The videoinit() function is responsible for setting most of the elements in this record. If you don't call videoinit(), they will default to CGA settings. If you modify any of these, you must modify them AFTER the call to videoinit(). The one exception is _vinfo.dvcheck which, if used, must be set BEFORE the call to videoinit(). The setvparam() function should be used where possible. The individual structure elements are: videoseg - video buffer segment address. Default is 0xb800. adapter - video adapter type. Default is V_CGA. 8 numrows - number of displayed rows. Default is 25. numcols - number of displayed columns. Default is 80. cheight - character height in pixels. Default is 8. cwidth - character width in pixels. Default is 8. mono - is it a monochrome video adapter? Default is 0. mapattr - map color attribs to monochrome attribs? By default, if a monochrome video adapter is detected by videoinit(), then all color attributes will be mapped to monochrome equivalents. To disable this automatic mapping, set _vinfo.mapattr=0;. Default is 1. cgasnow - is CGA snow present? To turn snow elimination on, set _vinfo.cgasnow=1; and _vinfo.usebios=0;. Default is 0. usebios - use BIOS for video writes? To use BIOS for video writes, set _vinfo.usebios=1; and _vinfo.cgasnow=0;. Default is 0. dvcheck - check for DESQview? To disable videoinit() from checking for DESQview, set _vinfo.dvcheck=0; before calling videoinit(). Default is 1. dvexist - is DESQview present? Default is 0. SYNOPSIS #include "cxlvid.h" struct _vinfo_t _vinfo; ------------------------------------------------------------------------ NAME _winfo DESCRIPTION The window information record. The individual structure elements are: active - pointer to active window's record. hidden - pointer to head hidden window's record. menu - pointer to head menu's record. cmenu - pointer to current menu's record. helptr - pointer to help information record. handle - last handle given to a window. Every time wopen() creates a new window, it increments this value. maxfiles - maximum number of files that can be displayed by wpickfile(). Default is 500. help - current help category number. errno - error number from last windowing function. Most windowing functions set this variable before returning. The werrmsg() function returns a literal representation of this value. total - total number of open windows. mlevel - system variable used by menu functions. ilevel - system variable used by menu functions. esc - check for [Esc] in input funcions? You should use the wsetesc() function to set this value. Default is 1 (yes). tabwidth - window TTY output tab width. You can use wtabwidth() 9 to set this value. Default is 8. fillch - character to fill windows with. You should use wfillch() to set this value. Default is ' '. SYNOPSIS #include "cxlwin.h" struct _winfo_t _winfo; 10 Library Functions NAME attrib DESCRIPTION Creates a text attribute. It is usually much easier to create a text attribute using the attribute identifiers listed in Appendix A, but this provides an alternate method. SYNOPSIS #include "cxlvid.h" int attrib(int fore,int back,int bright,int blink); INPUTS fore - foreground color code (0-7) back - background color code (0-7) bright - intensity (0-1) blink - blinking (0-1) RETURN VALUE The new attribute code. ALSO SEE setattr wtextattr EXAMPLE prints(10,5,attrib(6,0,1,1),"Hello, world"); ------------------------------------------------------------------------ NAME beep DESCRIPTION Sounds a beep in the speaker. SYNOPSIS #include "cxldef.h" void beep(void); ALSO SEE sound_ ------------------------------------------------------------------------ NAME biosver DESCRIPTION Returns the ROM BIOS version date. SYNOPSIS 11 #include "cxldef.h" char *biosver(void); RETURN VALUE The address of the static string containing the ROM BIOS version date. ALSO SEE machid ------------------------------------------------------------------------ NAME box_ DESCRIPTION "Draws" a text box on the screen. SYNOPSIS #include "cxlvid.h" void box_(int srow,int scol,int erow,int ecol,int btype,int attr); INPUTS srow - start row of box scol - start column of box erow - end row of box ecol - end column of box btype - box type. Can be one of the following: 0 - single line 1 - double line 2 - single horz, double vert line 3 - double horz, single vert line 4 - thick line 5 - no border (uses spaces for box chars) attr - text attribute for border characters ALSO SEE fill_ EXAMPLE box_(10,10,20,40,2,YELLOW|_BLACK); ------------------------------------------------------------------------ NAME capsoff DESCRIPTION Toggles the CapsLock key off. SYNOPSIS #include "cxlkey.h" void capsoff(void); 12 ALSO SEE capson kbstat numoff numon ------------------------------------------------------------------------ NAME capson DESCRIPTION Toggles the CapsLock key on. SYNOPSIS #include "cxlkey.h" void capson(void); ALSO SEE capsoff kbstat numoff numon ------------------------------------------------------------------------ NAME cclrscrn DESCRIPTION Clears the screen using given text attribute and homes the cursor. SYNOPSIS #include "cxlvid.h" void cclrscrn(int attr); INPUTS attr - text attribute to use to clear the screen with ALSO SEE clreol_ clrscrn clrwin EXAMPLE cclrscrn(BLACK|_BLACK); ------------------------------------------------------------------------ NAME cgardbyte DESCRIPTION Reads a byte from CGA video memory without snow. SYNOPSIS #include "cxlvid.h" int cgardbyte(char far *src); INPUTS src - far address to CGA video memory to read. 13 RETURN VALUE The byte read. ALSO SEE cgardword cgareadn cgawrbyte cgawriten cgawrstr cgawrword ------------------------------------------------------------------------ NAME cgardword DESCRIPTION Reads a word from CGA video memory without snow. SYNOPSIS #include "cxlvid.h" int cgardword(int far *src); INPUTS src - far address to CGA video memory to read. RETURN VALUE The word read. ALSO SEE cgardbyte cgareadn cgawrbyte cgawriten cgawrstr cgawrword ------------------------------------------------------------------------ NAME cgareadn DESCRIPTION Reads n words from CGA video memory without snow. SYNOPSIS #include "cxlvid.h" void cgareadn(int far *src,int *dest,unsigned n); INPUTS src - far address to CGA video memory to read. dest - address of buffer where words will be copied to. n - number of words to read. ALSO SEE cgardbyte cgardword cgawrbyte cgawriten cgawrstr cgawrword ------------------------------------------------------------------------ NAME cgawrbyte DESCRIPTION Writes a byte to CGA video memory without snow. 14 SYNOPSIS #include "cxlvid.h" void cgawrbyte(char far *dest,int chr); INPUTS dest - far address to CGA video memory to write to. chr - the byte to write ALSO SEE cgardbyte cgardword cgareadn cgawriten cgawrstr cgawrword ------------------------------------------------------------------------ NAME cgawriten DESCRIPTION Writes n words to CGA video memory without snow. SYNOPSIS #include "cxlvid.h" void cgawriten(int *src,int far *dest,unsigned n); INPUTS src - address of source buffer from which words will be read. dest - far address to CGA video memory to write to. n - number of words to write. ALSO SEE cgardbyte cgardword cgareadn cgawrbyte cgawrstr cgawrword ------------------------------------------------------------------------ NAME cgawrstr DESCRIPTION Writes a string to CGA video memory without snow. SYNOPSIS #include "cxlvid.h" void cgawrstr(char far *dest,char *string,int attr); INPUTS dest - far address to CGA video memory to write to. string - address of the string to be written. attr - text attribute to be used for characters in string. ALSO SEE cgardbyte cgardword cgareadn cgawrbyte cgawriten cgawrword ------------------------------------------------------------------------ NAME 15 cgawrword DESCRIPTION Writes a word to CGA video memory without snow. SYNOPSIS #include "cxlvid.h" void cgawrword(int far *dest,int chratr); INPUTS dest - far address to CGA video memory to write to. chratr - word to be written in the form ((attr<<8)|ch). ALSO SEE cgardbyte cgardword cgareadn cgawrbyte cgawriten cgawrstr ------------------------------------------------------------------------ NAME chgonkey DESCRIPTION The setonkey() function builds a linked list in memory that contains each defined onkey. This function, chgonkey(), allows you to maintain individual setonkey() lists and change back and forth between them. You *could* use several setonkey() calls to define and un-define keys where appropriate, but you would find that it is a lot of trouble. chgonkey() provides painless switching between onkey lists. SYNOPSIS #include "cxlkey.h" struct _onkey_t *chgonkey(struct _onkey_t *kblist); INPUTS The address of the onkey list to change to. If you specify NULL, then no onkeys will be visible. RETURN VALUE The address of the previous onkey list. Often you will want to save this address so that you can restore it later. ALSO SEE freonkey setonkey EXAMPLE struct _onkey_t *k1,*k2; setonkey(0x2100,do_alt_f,0); /* [Alt-F] is defined */ setonkey(0x2300,do_alt_f,0); /* [Alt-H] is defined */ k1=chgonkey(NULL); /* [Alt-F] and [Alt-H] are disabled */ setonkey(0x1205,do_ctrl_e,0); 16 /* [Ctrl-E] is defined */ k2=chgonkey(k1); /* [Ctrl-E] is disabled, [Alt-F] and [Alt-H] are reenabled */ freonkey(); /* [Alt-F] and [Alt-H] are disabled and freed from memory */ chgonkey(k2); /* [Ctrl-E] is reenabled */ ------------------------------------------------------------------------ NAME clearkeys DESCRIPTION Clears the keyboard buffer. SYNOPSIS #include #include "cxlkey.h" void clearkeys(void); ALSO SEE kbclear waitkey ------------------------------------------------------------------------ NAME clockcal DESCRIPTION Determines if a clock-calendar board is installed. This usually will only work with the clock-calendar boards in XT-style machines. SYNOPSIS #include "cxldef.h" int clockcal(void); RETURN VALUE Nonzero if a clock-calendar board is present. ------------------------------------------------------------------------ NAME clreol_ DESCRIPTION Clears to the end of line using the text attribute under the cursor. SYNOPSIS #include "cxlvid.h" void clreol_(void); ALSO SEE cclrscrn clrscrn clrwin 17 ------------------------------------------------------------------------ NAME clrscrn DESCRIPTION Clears the screen using the text attribute under the cursor, and homes the cursor. SYNOPSIS #include "cxlvid.h" void clrscrn(void); ALSO SEE cclrscrn clreol_ clrwin ------------------------------------------------------------------------ NAME clrwin DESCRIPTION Clears a window of the screen using the text attribute under the cursor. SYNOPSIS #include "cxlvid.h" void clrwin(int srow,int scol,int erow,int ecol); INPUTS srow - start row of window scol - start column of window erow - end row of window ecol - end column of window ALSO SEE cclrscrn clreol_ clrscrn ------------------------------------------------------------------------ NAME cvaltype DESCRIPTION Checks given character against a given CXL character type code, and determines if that character is valid for that type. This function is used internally by several CXL functions. SYNOPSIS #include "cxlstr.h" int cvaltype(int ch,int ctype); INPUTS ch - character to test 18 ctype - character type code to compare with. See section on CXL format strings for a list of valid character type codes. See Appendix D for a list of character type codes which can be used. RETURN VALUE -1 - invalid ctype was given 0 - character is not valid for given ctype 1 - character is valid for given ctype EXAMPLE printf("'A' is %sa valid character of type '#'\n",cvaltype('A','#')? "":"not "); printf("'7' is %sa valid character of type '#'\n",cvaltype('7','#')? "":"not "); ------------------------------------------------------------------------ NAME cvtcf DESCRIPTION Converts a CXL field string to a floating point number. SYNOPSIS #include "cxlstr.h" double cvtcf(char *field,int wholesize,int fracsize); INPUTS field - address of CXL field string wholesize - number of whole digits fracsize - number of fractional digits RETURN VALUE A double precision floating point number. ALSO SEE cvtci cvtfc cvtic EXAMPLE double pi; pi=cvtcf("314159",1,5); printf("pi = %f\n",pi); ------------------------------------------------------------------------ NAME cvtci DESCRIPTION Converts a CXL field string to an integer. SYNOPSIS #include "cxlstr.h" 19 int cvtci(char *field); INPUTS field - address of CXL field string RETURN VALUE An integer number. ALSO SEE cvtcf cvtfc cvtic EXAMPLE int i; i=cvtci("32767"); printf("i = %d\n",i); ------------------------------------------------------------------------ NAME cvtfc DESCRIPTION Converts a floating point number to a CXL field string. SYNOPSIS #include "cxlstr.h" void cvtfc(char *field,double value,int wholesize,int fracsize); INPUTS field - address of buffer to receive field string value - floating point number to convert wholesize - number of whole digits fracsize - number of fractional digits ALSO SEE cvtcf cvtci cvtic EXAMPLE char field[8]; cvtfc(field,3.14159,2,4); printf("field = '%s'\n",field); ------------------------------------------------------------------------ NAME cvtic DESCRIPTION Converts an integer to a CXL field string. SYNOPSIS #include "cxlstr.h" void cvtic(char *field,int value,int size); 20 INPUTS field - address of buffer to receive CXL field string value - integer value to convert size - field size ALSO SEE cvtcf cvtci cvtfc EXAMPLE char field[8]; cvtic(field,27,5); printf("field = '%s'\n",field); ------------------------------------------------------------------------ NAME cxlver DESCRIPTION Returns the CXL version number of the current CXL library in use. SYNOPSIS #include "cxldef.h" char *cxlver(void); RETURN VALUE The address of the static string containing the CXL version number. ------------------------------------------------------------------------ NAME delay_ DESCRIPTION Delays program execution for a specified duration. SYNOPSIS #include "cxldef.h" void delay_(unsigned duration); INPUTS duration - duration of delay (0-65535) ie. 182 = 10 seconds ALSO SEE timer waitkeyt EXAMPLE delay_(36); /* pause for 2 seconds */ ------------------------------------------------------------------------ NAME disktoscrn 21 DESCRIPTION Copies a previously saved screen disk file to the screen. SYNOPSIS #include "cxlvid.h" int disktoscrn(char *fname); INPUTS fname - address of the string containing file name to read from. RETURN VALUE Nonzero if an error occurred. ALSO SEE disktowin scrntodisk wintodisk EXAMPLE char fname[]="SCRN.DAT"; if(disktoscrn(fname)) { printf("Error reading file: %s\n",fname); exit(1); } ------------------------------------------------------------------------ NAME disktowin DESCRIPTION Copies a previously saved window disk file to the screen. SYNOPSIS #include "cxlvid.h" int disktowin(char *fname); INPUTS fname - address of the string containing file name of file to read from. RETURN VALUE Nonzero if an error occurred. ALSO SEE disktoscrn scrntodisk wintodisk EXAMPLE char fname[]="WIND.DAT"; if(disktowin(fname)) { printf("Error reading file: %s\n",fname); exit(1); } ------------------------------------------------------------------------ 22 EMS Functions CXL contains several functions for simple management of expanded memory. All of CXL's EMS functions are prefixed with 'ems'. For those not familiar with expanded memory, here is a brief explanation. The 8088 microprocessor is only able to address 1 Megabyte of memory. When applications started needing more memory, Lotus, Intel, and Microsoft developed the Expanded Memory Specification. This specification allows access to more than 1 Megabyte of memory by mapping 16K 'windows' of memory on an expanded memory board in and out of an unused area of DOS memory. The Expanded Memory Manager (EMM) is a software driver that controls the mapping. Physical pages are 16K blocks of memory which are located in an unused area of DOS memory. There are typically 4 physical pages comprising a 64K contiguous area of mappable DOS memory. The EMS page frame base address points to the beginning of the first physical page. Logical pages are 16K blocks of memory on the expanded memory board. There can be as many logical pages as the expanded memory board has, up to 8 Megabytes. Every program that uses expanded memory must do the following: 1. determine if the EMM device driver is loaded 2. determine if there are enough free pages for its application 3. allocate pages of expanded memory 4. find out what the EMS page frame base address is 5. map logical pages onto physical pages 6. deallocate pages when finished with them Here's an example of using CXL's EMS functions to perform these procedures: int handle1,handle2; char buf[14]; if(!emsexist()) { /* Check for the EMM driver. */ printf("EMM not loaded\n"); exit(1); } handle1=emsalloc(2); /* Request 2 pages of EMS */ /* memory. */ handle2=emsalloc(2); /* Request 2 more pages. */ if(handle1==-1 || handle2==-1) { /* Test for allocation error. */ printf("EMS allocation error\n"); exit(1); } emsmap(handle1,0,0); /* Map logical page 0 of handle */ /* 1 to physical page 0. */ emswrite("Hello, world",0,13); /* Write a string at offset 0, */ /* automatically determines what*/ /* the page frame address is. */ emsmap(handle2,0,0); /* Map logical page 0 of handle */ /* 2 to physical page 0. */ 23 emswrite("How are you?",0,13); /* Write a string at offset 0. */ emsmap(handle1,0,0); /* Map logical page 0 of handle */ /* 1 to physical page 0. */ emsread(buf,0,13); /* Read 13 bytes from offset 0 */ /* into buffer. */ printf("buf = %s\n",buf); /* Display buffer contents. */ emsmap(handle2,0,0); /* Map logical page 0 of handle */ /* 2 to physical page 0. */ emsread(buf,0,13); /* Read 13 bytes from offset 0 */ /* into buffer. */ printf("buf = %s\n",buf); /* Display buffer contents. */ emsdealloc(handle2); /* Deallocate pages belonging */ /* to handle 2. */ emsdealloc(handle1); /* Deallocate pages belonging */ /* to handle 1. */ ------------------------------------------------------------------------ NAME emsalloc DESCRIPTION Allocates pages of EMS memory. SYNOPSIS #include "cxlems.h" int emsalloc(int numpages); INPUTS numpages - the number of pages (16K blocks) of memory requested. For example, to allocate 512K of EMS memory, you would request 512/16, or 32 pages. RETURN VALUE The EMS handle assigned to the allocated block of memory, or -1 if an error occurred. ALSO SEE emsdealloc emsexist emsfree ------------------------------------------------------------------------ NAME emsdealloc DESCRIPTION Deallocates previously allocated pages of EMS memory. SYNOPSIS #include "cxlems.h" int emsdealloc(int handle); INPUTS handle - the EMS handle of the allocated EMS memory to deallocate 24 RETURN VALUE Nonzero if an error occurred. ALSO SEE emsalloc emsexist ------------------------------------------------------------------------ NAME emsexist DESCRIPTION Determines if the EMS device driver is loaded. SYNOPSIS #include "cxlems.h" int emsexist(void); RETURN VALUE Nonzero if an EMS driver is loaded and functioning properly. ALSO SEE emsfree emstotal expmem ------------------------------------------------------------------------ NAME emsframe DESCRIPTION Returns the EMS page frame base segment address. SYNOPSIS #include "cxlems.h" unsigned emsframe(void); RETURN VALUE The EMS page frame base segment address, or zero if an error occurred. ALSO SEE emsalloc emsexist emsmap EXAMPLE char far *p; p=MK_FP(emsframe(),0); printf("EMS memory starts at %Fp\n",p); ------------------------------------------------------------------------ NAME emsfree DESCRIPTION 25 Returns the number of free EMS pages (16K blocks). SYNOPSIS #include "cxlems.h" unsigned emsfree(void); RETURN VALUE The number of free EMS pages. ALSO SEE emsalloc emsdealloc emstotal ------------------------------------------------------------------------ NAME emsmap DESCRIPTION Maps a logical page of allocated EMS memory onto a physical page address. SYNOPSIS #include "cxlems.h" int emsmap(int handle,int lpage,int ppage); INPUTS handle - the EMS handle previosly assigned lpage - the logical EMS page to map (0 - ?) ppage - the physical DOS page to map to (0 - 3) RETURN VALUE Nonzero if an error occurred. ALSO SEE emsalloc emsdealloc emsframe ------------------------------------------------------------------------ NAME emsread DESCRIPTION Reads bytes from one or more pages of allocated EMS memory. The emsmap() function must be called prior to this function to make this memory accessible. The source segment used will be the current EMS page frame segment address and the destination segment will be your program's data segment. SYNOPSIS #include "cxlems.h" int emsread(char *dest,unsigned emsofs,unsigned numbytes); INPUTS dest - address of buffer to receive bytes read from EMS 26 emsofs - offset from the EMS page frame base segment address to read the bytes from. numbytes - the number of bytes to read RETURN VALUE Nonzero if an error occurred. ALSO SEE emsalloc emsdealloc emsmap emswrite ------------------------------------------------------------------------ NAME emstotal DESCRIPTION Returns the total number of EMS memory pages (16K blocks) on the system. SYNOPSIS #include "cxlems.h" unsigned emstotal(void); RETURN VALUE The total number of EMS memory pages on the system. ALSO SEE emsalloc emsdealloc emsexist emsfree expmem ------------------------------------------------------------------------ NAME emsver DESCRIPTION Returns the version of the EMS driver in use. SYNOPSIS #include "cxlems.h" char *emsver(void); RETURN VALUE The address of the static string containing the EMS version number, or NULL if an error occurred. ALSO SEE emsexist ------------------------------------------------------------------------ NAME emswrite DESCRIPTION 27 Writes bytes to one or more pages of EMS memory. The emsmap() function must have been called prior to calling this function so that the EMS memory will be available. The source segment will be your program's data segment and the destination segment will be the current EMS page frame segment address. SYNOPSIS #include "cxlems.h" int emswrite(char *src,unsigned emsofs,unsigned numbytes); INPUTS src - address of buffer that contains the bytes to be written emsofs - offset from EMS page frame base segment address to write bytes to numbytes - number of bytes to write RETURN VALUE Nonzero if an error occurred. ALSO SEE emsexist emsframe emsmap emsread ------------------------------------------------------------------------ NAME expmem DESCRIPTION Determines the amount, if any, of expanded memory on the system. An EMS driver does not have to be loaded to call this function. SYNOPSIS #include "cxldef.h" unsigned expmem(void); RETURN VALUE The amount of expanded memory in kilobytes. ALSO SEE emsexist extmem ------------------------------------------------------------------------ NAME extmem DESCRIPTION Determines the amount of extended memory on an AT-class machine. SYNOPSIS #include "cxldef.h" unsigned extmem(void); RETURN VALUE 28 The amount of extended memory in kilobytes. ALSO SEE expmem ------------------------------------------------------------------------ NAME fcrypt DESCRIPTION Encrypts or decrypts a text or binary file using a modified XOR encryption method. The same encryption key string must be used when decrypting the file as when encrypting it. SYNOPSIS #include "cxldef.h" int fcrypt(char *file,char *key); INPUTS file - address of filename string of file to encrypt or decrypt. key - address of encryption key string. The string can contain any ASCII characters (01 - FF). The longer the string is, the better the encryption. Do not lose the key, or you won't see your data again! RETURN VALUE Nonzero if an error occurred. ALSO SEE strcode EXAMPLE fcrypt("CXL.DOC","This is my encryption key string"); ------------------------------------------------------------------------ NAME fill_ DESCRIPTION Fills in a region of the screen with a specified character and attribute. SYNOPSIS #include "cxlvid.h" void fill_(int srow,int scol,int erow,int ecol,int ch,int attr); INPUTS srow - start row scol - start column erow - end row ecol - end column ch - character to fill with 29 attr - attribute of character ALSO SEE attrib box_ EXAMPLE fill_(5,15,16,42,'X',LRED|_MAGENTA); ------------------------------------------------------------------------ NAME freonkey DESCRIPTION Frees all active onkey definitions from memory. After this call, any keys defined using setonkey() will no longer be active. SYNOPSIS #include "cxlkey.h" void freonkey(void); ALSO SEE chgonkey setonkey ------------------------------------------------------------------------ NAME gameport DESCRIPTION Determines if a game port is installed. SYNOPSIS #include "cxldef.h" int gameport(void); RETURN VALUE Nonzero if a game port is installed. ALSO SEE mathchip numflop numpar numser ------------------------------------------------------------------------ NAME getchf DESCRIPTION Gets a character from the keyboard from a list of valid characters. The case of the letters in the valid character list is ignored. Provides Escape checking. SYNOPSIS #include "cxlkey.h" 30 int getchf(char *valid,int defchar); INPUTS valid - address of string containing list of valid characters defchar - default selection in case [Enter] is pressed, or zero if you don't want to have a default selection RETURN VALUE The character pressed, or zero if the [Esc] key was pressed. The returned character will be uppercase. ALSO SEE getxch waitkey EXAMPLE int ch; printf("Are you sure? "); ch=getchf("YN",'Y'); if(!ch) printf("[Esc] was pressed\n"); ------------------------------------------------------------------------ NAME getcursz DESCRIPTION Returns the start and stop scan lines of cursor. SYNOPSIS #include "cxlvid.h" void getcursz(int *sline,int *eline); INPUTS sline - address of integer to receive start scan line eline - address of integer to receive stop scan line ALSO SEE setcursz EXAMPLE int sline,eline; getcursz(&sline,&eline); printf("Cursor start & stop scan lines: %d, %d\n",sline,eline); ------------------------------------------------------------------------ NAME getns DESCRIPTION Inputs a string of a specified maximum length from the keyboard. Provides Escape checking. SYNOPSIS 31 #include "cxlkey.h" int getns(char *str,int maxchars); INPUTS str - address of buffer to receive input string maxchars - maximum length of the input string RETURN VALUE Nonzero if the [Esc] key was pressed during user input. ALSO SEE inputsf EXAMPLE char name[11]; printf("Enter your name: "); if(getns(name,10)) printf("\n[Esc] was pressed\n"); else printf("\nYour name is: %s\n",name); ------------------------------------------------------------------------ NAME getxch DESCRIPTION Gets a key (ASCII code/scan code) from the keyboard. All CXL functions that interract with the keyboard call this function for input. SYNOPSIS #include "cxlkey.h" unsigned getxch(void); RETURN VALUE The keycode of the pressed key. The keycode contains the scan code of the keypress in the upper byte, and the ASCII character in the lower byte. A list of keycodes is in Appendix B. ALSO SEE getchf EXAMPLE unsigned int keycode; printf("Press a key: "); keycode=getxch(); printf("%c\nkeycode = %#x, scancode = %d, ASCII code = %d\n" ,keycode,keycode,keycode>>8,keycode&0x00ff); ------------------------------------------------------------------------ NAME gotoxy_ 32 DESCRIPTION Sets cursor coordinates on the screen. SYNOPSIS #include "cxlvid.h" void gotoxy_(int row,int col); INPUTS row - cursor row (Y coordinate) col - cursor column (X coordinate) ALSO SEE readcur ------------------------------------------------------------------------ NAME hidecur DESCRIPTION Hides the cursor. Retains the cursor shape so that when showcur() is called, the original cursor shape will be restored. SYNOPSIS #include "cxlvid.h" void hidecur(void); ALSO SEE lgcursor setcursz showcur smcursor ------------------------------------------------------------------------ NAME inputsf DESCRIPTION Inputs a formatted string from the keyboard. This function provides an extremely powerful method of accept single-line input from the user. You can limit input characters to certain characters of a type, such as numbers, insert strings in between typed in characters, create custom prompts, disable [Enter] until the field is filled, and more. Provides Escape checking. SYNOPSIS #include "cxlkey.h" int inputsf(char *str,char *fmt); INPUTS str - address of the buffer receive input string fmt - address of the format string. See Appendix D for valid format string characters. RETURN VALUE 0 - no error 33 1 - [Esc] key was pressed 2 - invalid format string ALSO SEE getns EXAMPLE char buf[21]; if(inputsf(buf,"'Enter your name: '!M!AAAAAAAAAAAAAAAAAAAA")==1) printf("\n[Esc] key was pressed\n"); else printf("\nYour name is: %s\n",buf); ------------------------------------------------------------------------ NAME kbclear DESCRIPTION Clears CXL's internal keyboard buffer. SYNOPSIS #include "cxlkey.h" void kbclear(void); ALSO SEE clearkeys kbmhit kbput kbputs ------------------------------------------------------------------------ NAME kbmhit DESCRIPTION Determines if a key has been pressed and is waiting to be got. Also checks for mouse button presses. Replaces the kbhit() function. SYNOPSIS #include "cxlkey.h" int kbmhit(void); RETURN VALUE Nonzero if a key is waiting to be got. ALSO SEE kbclear ------------------------------------------------------------------------ NAME kbput DESCRIPTION Places a keystroke into CXL's internal keyboard buffer. This will 34 only affect CXL's keyboard input functions. This function is useful for making keyboard scripts for demos, etc., or forcing user keyboard input. SYNOPSIS #include "cxlkey.h" int kbput(unsigned xch); INPUTS xch - keycode of keypress to place in buffer. The scan code will be in the high byte and the ASCII code will be in the low byte. See Appendix B for a list of keycodes which you can use. RETURN VALUE Nonzero if memory allocation error. ALSO SEE kbclear kbputs EXAMPLE kbput(0x011b); /* puts an [Esc] keypress into CXL's buffer */ ------------------------------------------------------------------------ NAME kbputs DESCRIPTION Places a string of characters into CXL's internal keyboard buffer. This will only affect CXL's keyboard input functions. This function is useful for making keyboard scripts for demos, etc., and forcing user keyboard input. SYNOPSIS #include "cxlkey.h" int kbputs(char *str); INPUTS str - address of string of characters to stuff into buffer RETURN VALUE Nonzero if memory allocation error. ALSO SEE kbclear kbput EXAMPLE char buf[21]; kbputs("Mike"); printf("Enter your name: "); getns(buf,20); ------------------------------------------------------------------------ 35 NAME kbstat DESCRIPTION Returns the status of the keyboard control keys. SYNOPSIS #include "cxlkey.h" unsigned kbstat(void); RETURN VALUE Status word of the keyboard flag. You can determine which key(s) are being pressed/toggled by masking the status word (using the bitwise '&' operator) with one of the following: RSHIFT - right shift pressed LSHIFT - left shift pressed CTRL - [Ctrl] pressed ALT - [Alt] pressed SCRLOCK - [ScrollLock] toggled NUMLOCK - [NumLock] toggled CAPSLOCK - [CapsLock] toggled INS - [Ins] toggled ALSO SEE capsoff capson numoff numon EXAMPLE printf("NumLock is %s\n",(kbstat()&NUMLOCK)?"on":"off"); ------------------------------------------------------------------------ NAME lcrlf DESCRIPTION Prints a carriage return and line feed on the printer (PRN). SYNOPSIS #include "cxlprn.h" void lcrlf(void); ALSO SEE lprintc lprintf lprints ------------------------------------------------------------------------ NAME lgcursor DESCRIPTION Makes the cursor large. SYNOPSIS #include "cxlvid.h" 36 void lgcursor(void); ALSO SEE hidecur setcursz showcur smcursor ------------------------------------------------------------------------ NAME lprintc DESCRIPTION Prints a character on the printer (PRN). SYNOPSIS #include "cxlprn.h" void lprintc(int ch); INPUTS ch - the character to print ALSO SEE lcrlf lprintf EXAMPLE lprintc(12); /* sends a form feed to the printer */ ------------------------------------------------------------------------ NAME lprintf DESCRIPTION Sends formatted output to the printer (PRN). Works similar to the standard C printf() function. SYNOPSIS #include "cxlprn.h" void lprintf(const char *format,...); INPUTS format - format string. Refer to the section on printf() in your compiler's run-time library reference. ... - any additional arguments ALSO SEE lcrlf lprintc lprintns lprints EXAMPLE char s[]="Hello"; int i=5; char c='Z'; lprintf("s = %s, i = %d, c = %c\n\f",s,i,c); ------------------------------------------------------------------------ 37 NAME lprintns DESCRIPTION Prints a string to a fixed width on the printer (PRN). SYNOPSIS #include "cxlprn.h" void lprintns(char *str,int width); INPUTS str - the address of the string to print width - width to print string, either by padding or truncating. ALSO SEE lcrlf lprintf lprints lprintsu EXAMPLE char string[]="Hello, world"; lprintns(string,5); lprintf(".\n"); lprintns(string,20); lprintf(".\n"); ------------------------------------------------------------------------ NAME lprints DESCRIPTION Prints a string on the printer (PRN). SYNOPSIS #include "cxlprn.h" void lprints(char *str); INPUTS str - the address of the string to print ALSO SEE lcrlf lprintf lprintns lprintsu EXAMPLE lprints("Hello, world\n"); ------------------------------------------------------------------------ NAME lprintsb DESCRIPTION Prints a bold-faced string on the printer (PRN). SYNOPSIS 38 #include "cxlprn.h" void lprintsb(char *str,int reps); INPUTS str - address of the string to print reps - number of strike repetitions (the more, the darker the print) ALSO SEE lcrlf lprintf lprintns lprints lprintsu ------------------------------------------------------------------------ NAME lprintsu DESCRIPTION Prints an underlined string on the printer (PRN). SYNOPSIS #include "cxlprn.h" void lprintsu(char *str); INPUTS str - address of the string to print ALSO SEE lcrlf lprintf lprintns lprints lprintsb ------------------------------------------------------------------------ NAME machid DESCRIPTION Returns the value of the machine ROM ID byte. SYNOPSIS #include "cxldef.h" int machid(void); RETURN VALUE The value of the machine ROM ID byte. Will usually be one of the following values. Any other value is unknown. IBMPC - IBM PC IBMPCXT - IBM PC/XT IBMPCJR - IBM PCjr IBMPCAT - IBM PC/AT IBMPCXT2 - IBM PC/XT-2 IBMCONV - IBM PC Convertible SPERRYPC - Sperry PC ALSO SEE biosver 39 ------------------------------------------------------------------------ NAME mapattr DESCRIPTION Translates a color text attribute into its approximate monochrome equivalent. All of CXL's video functions automatically call this, so you would only need to call this for your own functions. SYNOPSIS #include "cxlvid.h" int mapattr(int attr); INPUTS attr - the color text attribute to translate RETURN VALUE The monochrome equivalent of the color text attribute. ALSO SEE revsattr EXAMPLE int attr=LCYAN|_BLUE; prints(0,0,attr,"In living color!"); _vinfo.mapattr=1; /* force monochrome attributes */ prints(1,0,mapattr(attr),"In dull monochrome...."); ------------------------------------------------------------------------ NAME mathchip DESCRIPTION Determines if a math coprocessor is installed. SYNOPSIS #include "cxldef.h" int mathchip(void); RETURN VALUE Nonzero if a math coprocessor is installed. ALSO SEE gameport numflop numpar numser EXAMPLE printf("You do %shave a math coprocessor\n",mathchip()?"":"not "); ------------------------------------------------------------------------ NAME mode 40 DESCRIPTION Sets the video mode. SYNOPSIS #include "cxlvid.h" void mode(int mode_code); INPUTS mode_code - video mode code ALSO SEE setlines vidmode vidtype ------------------------------------------------------------------------ NAME msbclear DESCRIPTION Clears the mouse driver's "button presses" and "button releases" counters (removes them from the queue). SYNOPSIS #include "cxlmou.h" void msbclear(void); ALSO SEE kbmhit msbpress msbreles msinit msstatus ------------------------------------------------------------------------ NAME msbpress DESCRIPTION Returns information about the specific button presses of mouse. SYNOPSIS #include "cxlmou.h" void msbpress(int button,int *bstat,int *bcount,int *row,int *col); INPUTS button - button to check: 0 - left button 1 - right button 2 - middle button (if applicable) bstat - address of integer to receive button status word. Possible button status values are: 0 - no buttons pressed 1 - left button pressed 2 - right button pressed 4 - middle button pressed (if applicable) 3 - left & right buttons pressed 5 - left & middle buttons pressed (if applicable) 41 6 - middle & right buttons pressed (if applicable) 7 - all 3 buttons pressed (if applicable) bcount - address of integer to receive number of times pressed since last call row - address of integer to receive row at time of button press col - address of integer to receive column at time of button press ALSO SEE msbclear msbreles msinit msstatus EXAMPLE int bstat,bcount,row,col; msbpress(0,&bstat,&bcount,&row,&col); ------------------------------------------------------------------------ NAME msbreles DESCRIPTION Returns informmation about specific button releases of mouse. SYNOPSIS #include "cxlmou.h" void msbreles(int button,int *bstat,int *bcount,int *row,int *col); INPUTS button - button to check: 0 - left button 1 - right button 2 - middle button (if applicable) bstat - address of integer to receive button status word. Possible button status values are: 0 - no buttons pressed 1 - left button pressed 2 - right button pressed 4 - middle button pressed (if applicable) 3 - left & right buttons pressed 5 - left & middle buttons pressed (if applicable) 6 - middle & right buttons pressed (if applicable) 7 - all 3 buttons pressed (if applicable) bcount - address of integer to receive number of times released since last call row - address of integer to receive row at time of button release col - address of integer to receive column at time of button release ALSO SEE msbclear msbpress msinit msstatus EXAMPLE int bstat,bcount,row,col; msbreles(0,&bstat,&bcount,&row,&col); 42 ------------------------------------------------------------------------ NAME mscondoff DESCRIPTION Conditionally hides the mouse cursor depending on whether or not the mouse cursor falls within the input screen coordinates. SYNOPSIS #include "cxlmou.h" void mscondoff(int srow,int scol,int erow,int ecol); INPUTS srow - start row scol - start column erow - end row ecol - end column ALSO SEE mshidecur msinit msshowcur ------------------------------------------------------------------------ NAME mscursor DESCRIPTION Sets the mouse text cursor type. The mouse cursor can be a hardware or softare cursor. The hardware cursor is the same as the normal cursor you see when you are at the DOS prompt. Because the mouse's hardware cursor is the same as the normal cursor, they can interfere with each other, making this method impractical to use in most cases. The software mouse cursor is a text box that can reveal the underlying character. This is the cursor most used by programs including other CXL mouse support functions. SYNOPSIS #include "cxlmou.h" void mscursor(unsigned curtype,unsigned smask,unsigned cmask); INPUTS curtype - cursor type. 0=software, 1=hardware smask - screen mask (software cursor) or start scan line (hardware cursor). If using a software cursor, the screen mask determines which of the characters attributes are preserved. It is ANDed with the screen character and attribute. The bit format for both smask and cmask are: Bit Content --- ------- 0-7 - ASCII character code 8-10 - foreground color 11 - 0=intensity off, 1=intensity on 12-14 - background color 43 15 - 0=no blink, 1=blink cmask - cursor mask (software cursor) or stop scan line (hardware cursor). If using a software cursor, the cursor mask is used to determine which of the characteristics are changed by the cursor. The cmask is XORed with the result of (smask AND character-attribute). The bit values for cmask are the same as those for smask. ALSO SEE msinit msshowcur EXAMPLE mscursor(1,1,7); /* makes a full-block hardware cursor */ msshowcur(); ------------------------------------------------------------------------ NAME msgotoxy DESCRIPTION Sets the mouse cursor coordinates. SYNOPSIS #include "cxlmou.h" void msgotoxy(int row,int col); INPUTS row - row (Y coordinate) col - column (X coordinate) ALSO SEE msinit msstatus EXAMPLE msgotoxy(13,45); /* sets mouse cursor to row 13, column 45 */ ------------------------------------------------------------------------ NAME mshbounds DESCRIPTION Sets the mouse's upper and lower horizontal bounds. SYNOPSIS #include "cxlmou.h" void mshbounds(int leftcol,int rightcol); INPUTS leftcol - left column boundary rightcol - right column boundary ALSO SEE 44 msinit msvbounds EXAMPLE mshbounds(5,45); /* restricts mouse cursor movement */ /* between columns 5 & 45 */ ------------------------------------------------------------------------ NAME mshidecur DESCRIPTION Hides the mouse cursor. SYNOPSIS #include "cxlmou.h" void mshidecur(void); ALSO SEE msinit msshowcur ------------------------------------------------------------------------ NAME msinit DESCRIPTION Determines if a mouse is present. If so, initializes mouse and sets the global variable _mouse to MS_KEYS which causes mouse movements to be translated to the keyboard arrow keys. SYNOPSIS #include "cxlmou.h" int msinit(void); RETURN VALUE Nonzero if mouse is present. ALSO SEE mssupport EXAMPLE if(msinit()) printf("Mouse initialized\n"); else printf("Mouse does not exist\n"); ------------------------------------------------------------------------ NAME msmotion DESCRIPTION Gets information about the movement of the mouse. 45 SYNOPSIS #include "cxlmou.h" void msmotion(int *rowcount,int *colcount); INPUTS rowcount - address of integer to receive number of rows moved colcount - address of integer to receive number of columns moved ALSO SEE msinit msstatus EXAMPLE int rowcount,colcount; msmotion(&rowcount,&colcount); ------------------------------------------------------------------------ NAME msshowcur DESCRIPTION Reveals the hidden mouse cursor. SYNOPSIS #include "cxlmou.h" void msshowcur(void); ALSO SEE mscursor mshidecur msinit ------------------------------------------------------------------------ NAME msspeed DESCRIPTION Adjusts the mouse's speed by changing its sensitivity. SYNOPSIS #include "cxlmou.h" void msspeed(int xratio,int yratio); INPUTS xratio - horizontal speed (higher numbers are slower) yratio - vertical speed (higher numbers are slower) ALSO SEE msinit ------------------------------------------------------------------------ NAME msstatus 46 DESCRIPTION Returns the status of the mouse. SYNOPSIS #include "cxlmou.h" void msstatus(int *bstat,int *row,int *col); INPUTS bstat - address of integer to receive button status word. Possible button status values are: 0 - no buttons pressed 1 - left button pressed 2 - right button pressed 4 - middle button pressed (if applicable) 3 - left & right buttons pressed 5 - left & middle buttons pressed (if applicable) 6 - middle & right buttons pressed (if applicable) 7 - all 3 buttons pressed (if applicable) row - address of integer to receive current row coordinate col - address of integer to receive current column coordinate ALSO SEE msinit EXAMPLE int bstat,row,col; msstatus(&bstat,&row,&col); printf("The mouse cursor is at row %d, column %d\n",row,col); ------------------------------------------------------------------------ NAME mssupport DESCRIPTION Selects the type of mouse support to be used by CXL functions which support them. If no mouse exists, the call to this function is ignored. This function should be called after msinit(). SYNOPSIS #include "cxlmou.h" void mssupport(int type); INPUTS type - type of mouse support. Can be one of the following: MS_NONE - no mouse support MS_KEYS - mouse movements are translated into keystrokes. This is the default set by msinit() if it finds a mouse driver present. MS_CURS - point-and-shoot mouse cursor where supported MS_FULL - full mouse support. If a CXL function supports a point-and-shoot mouse cursor, then that will be used, otherwise mouse movements will be translated into keystrokes. 47 ALSO SEE msinit EXAMPLE mssupport(MS_FULL); ------------------------------------------------------------------------ NAME msvbounds DESCRIPTION Sets the mouse's left and right vertical bounds. SYNOPSIS #include "cxlmou.h" void msvbounds(int toprow,int botrow); INPUTS toprow - top row boundary botrow - bottom row boundary ALSO SEE mshbounds msinit EXAMPLE msvbounds(3,20); /* restricts mouse cursor movement */ /* between rows 3 and 20 */ ------------------------------------------------------------------------ NAME numflop DESCRIPTION Returns the number of floppy disk drives installed. SYNOPSIS #include "cxldef.h" int numflop(void); RETURN VALUE The number of floppy disk drives installed ALSO SEE gameport mathchip numpar numser EXAMPLE printf("You have %d floppy drives installed\n",numflop()); ------------------------------------------------------------------------ NAME numoff 48 DESCRIPTION Toggles the NumLock key off. SYNOPSIS #include "cxlkey.h" void numoff(void); ALSO SEE capsoff kbstat numon ------------------------------------------------------------------------ NAME numon DESCRIPTION Toggles the NumLock key on. SYNOPSIS #include "cxlkey.h" void numon(void); ALSO SEE capson kbstat numoff ------------------------------------------------------------------------ NAME numpar DESCRIPTION Returns the number of parallel ports. SYNOPSIS #include "cxldef.h" int numpar(void); RETURN VALUE The number of parallel ports installed. ALSO SEE gameport mathchip numflop numser EXAMPLE printf("You have %d parallel ports\n",numpar()); ------------------------------------------------------------------------ NAME numser DESCRIPTION Returns the number of serial ports installed. 49 SYNOPSIS #include "cxldef.h" int numser(void); RETURN VALUE The number of serial ports installed. ALSO SEE gameport mathchip numflop numpar EXAMPLE printf("You have %d serial ports\n",numser()); ------------------------------------------------------------------------ NAME printc DESCRIPTION Displays a character to the screen at a specified location, using a specified attribute. Does not recognize control characters. Does not affect cursor position. SYNOPSIS #include "cxlvid.h" void printc(int row,int col,int attr,int ch); INPUTS row - row to display character at col - column to display character at attr - text attribute for character ch - character to print ALSO SEE attrib prints EXAMPLE printc(12,40,BLINK|LRED|_BLACK,'!'); ------------------------------------------------------------------------ NAME prints DESCRIPTION Displays a string on the screen at a specified location, using a specified attribute. Does not affect cursor position. SYNOPSIS #include "cxlvid.h" void prints(int row,int col,int attr,char *str); INPUTS row - row to display string at 50 col - column to display string at attr - text attribute for characters displayed str - address of string to display ALSO SEE attrib printc EXAMPLE prints(24,15,YELLOW|_BROWN,"Hello, world"); ------------------------------------------------------------------------ NAME putchat DESCRIPTION Puts a character and its attribute on the screen at current cursor position using video BIOS calls. SYNOPSIS #include "cxlvid.h" void putchat(int ch,int attr); INPUTS ch - character to display attr - attribute to display character in ALSO SEE readchat ------------------------------------------------------------------------ NAME randfile DESCRIPTION Creates a random file name. SYNOPSIS #include "cxldef.h" char *randfile(void); RETURN VALUE Address of the static string containing the random file name. EXAMPLE printf("A random file name is: %s\n",randfile()); ------------------------------------------------------------------------ NAME readchat DESCRIPTION 51 Reads the character and attribute under the cursor using video BIOS calls. SYNOPSIS #include "cxlvid.h" unsigned readchat(void); RETURN VALUE Unsigned integer containing the character in the low byte and attribute in the high byte. ALSO SEE putchat revattr setattr EXAMPLE unsigned int chat; chat=readchat(); printf("character value = %d, attribute value = %d\n",chat&0x00ff ,chat>>8); ------------------------------------------------------------------------ NAME readcur DESCRIPTION Reads the current cursor location. SYNOPSIS #include "cxlvid.h" void readcur(int *row,int *col); INPUTS row - address of integer to receive cursor row col - address of integer to receive cursor column ALSO SEE gotoxy_ EXAMPLE int row,col; readcur(&row,&col); printf("The cursor is at row %d, column %d\n",row,col); ------------------------------------------------------------------------ NAME revattr DESCRIPTION Reverses the attribute of the character under the current cursor position, and continues for the specified number of characters. Uses video BIOS calls. 52 SYNOPSIS #include "cxlvid.h" void revattr(int count); INPUTS count - the number of characters to reverse the attribute of ALSO SEE readchat revsattr setattr EXAMPLE prints(0,0,LCYAN|_BLUE,"Hello, world"); gotoxy_(0,0); revattr(5); ------------------------------------------------------------------------ NAME revsattr DESCRIPTION Returns the inverse of the given text attribute. SYNOPSIS #include "cxlvid.h" int revsattr(int attr); INPUTS attr - text attribute RETURN VALUE The inverted text attribute. ALSO SEE mapattr revattr EXAMPLE int attr=LMAGENTA|_RED; prints(0,0,attr,"Normal"); prints(1,0,revsattr(attr),"Reverse"); ------------------------------------------------------------------------ NAME scancode DESCRIPTION Returns the common scan code of the specified character. SYNOPSIS #include "cxlkey.h" int scancode(int ch); INPUTS 53 ch - an ASCII character RETURN VALUE The common scan code of the specified character. The characters '0' thru '9', '*', '-', '+', and '.' will return their scan code from their regular keys, not their numeric keypad keys. ------------------------------------------------------------------------ NAME scrndump DESCRIPTION Dumps the current screen to the printer (PRN). SYNOPSIS #include "cxlprn.h" void scrndump(void); ALSO SEE scrntodisk ssave videoinit ------------------------------------------------------------------------ NAME scrntodisk DESCRIPTION Copies the current screen to a disk file. SYNOPSIS #include "cxlvid.h" int scrntodisk(char *fname); INPUTS fname - address of the string containing the filename of the file to write to RETURN VALUE Nonzero if an error occurred. ALSO SEE disktoscrn scrndump ssave wintodisk ------------------------------------------------------------------------ NAME setattr DESCRIPTION Sets the attribute of the character under the current cursor location, and continues for the specified number of characters. Uses video BIOS calls. 54 SYNOPSIS #include "cxlvid.h" void setattr(int attr,int count); INPUTS attr - attribute to set character count - the number of characters to set the attribute of ALSO SEE attrib readchat revattr EXAMPLE prints(0,0,LCYAN|_BLUE,"Hello, world"); gotoxy_(0,0); setattr(LMAGENTA|_RED,5); ------------------------------------------------------------------------ NAME setcursz DESCRIPTION Sets the cursor size. This function is video adapter dependent. SYNOPSIS #include "cxlvid.h" void setcursz(int sline,int eline); INPUTS sline - start line of cursor, 32 = no cursor eline - end line of cursor ALSO SEE getcursz hidecur lgcursor showcur smcursor EXAMPLE setcursz(1,7); /* sets cursor to large block on color displays */ ------------------------------------------------------------------------ NAME setkbloop DESCRIPTION Most of the time your program is idle, it is waiting for a keypress. This function allows you to set up a function that will be called while waiting for a keypress. For example, you could update a status line, or update a time clock continuously while waiting for a keypress. SYNOPSIS #include "cxlkey.h" void setkbloop(void (*func)(void)); 55 INPUTS func - address of the function to be called while waiting for keypress or NULL to cancel the procedure. ALSO SEE waitkey waitkeyt ------------------------------------------------------------------------ NAME setlines DESCRIPTION Sets the number of lines on the display. The videoinit() function must have previously been called. SYNOPSIS #include "cxlvid.h" int setlines(int numlines); INPUTS numlines - the number of lines to set the display to. Valid numbers are: 25 - all video adapters 43 - EGA 50 - VGA RETURN VALUE Nonzero if an error occurred. ALSO SEE mode videoinit vidtype EXAMPLE printf("%s\n",setlines(43)?"You do not have an EGA card": "You are now in EGA 43-line mode"); ------------------------------------------------------------------------ NAME setonkey DESCRIPTION Attaches/detaches a keypress to a function call. Works by intercepting any calls to CXL keyboard input functions. Whenever you use one of CXL's keyboard input functions, the input function will check to see if the pressed key has been defined. If so, then the input function will call the corresponding function. If not, then the input function will pass on the keypress as normal. SYNOPSIS #include "cxlkey.h" int setonkey(unsigned keycode,void (*func) (void),unsigned pass); 56 INPUTS keycode - keycode of key to define. If the keycode was previously defined, it will be re-defined. See Appendix B for a list of keycodes. func - address of the function to call upon keypress. If NULL is specified for func, then the specified keycode will be un-defined. pass - keycode of key to pass back to caller after the onkey function returns. This allows you to have one keypress return the code for another. If pass==0, then the key will not be passed back, and execution will resume where the interruption occurred. RETURN VALUE Nonzero if a memory allocation error occurred. ALSO SEE chgonkey freonkey setkbloop EXAMPLE setonkey(0x011b,escape_routine,0); ------------------------------------------------------------------------ NAME setvparam DESCRIPTION Sets video display parameters. SYNOPSIS #include "cxlvid.h" int setvparam(int setting); INPUTS setting - video display parameter. Can be one of the following: VP_DMA - turn on direct screen writes VP_CGA - turn on direct screen writes w/CGA snow elimination VP_BIOS - turn on BIOS screen writes VP_MONO - turn on monochrome attribute translation VP_COLOR - turn off monochrome attribute translation RETURN VALUE Nonzero if error. ALSO SEE videoinit vidtype ------------------------------------------------------------------------ NAME showcur DESCRIPTION 57 Reveals the hidden cursor, restoring it to its previous shape. SYNOPSIS #include "cxlvid.h" void showcur(void); ALSO SEE hidecur lgcursor setcursz smcursor ------------------------------------------------------------------------ NAME smcursor DESCRIPTION Makes the cursor small. SYNOPSIS #include "cxlvid.h" void smcursor(void); ALSO SEE hidecur lgcursor setcursz showcur ------------------------------------------------------------------------ NAME sound_ DESCRIPTION Sounds a tone of specified pitch and duration. SYNOPSIS #include "cxldef.h" void sound_(unsigned pitch,unsigned duration); INPUTS pitch - pitch of tone (0-65535) duration - duration of tone (0-65535). ie. 182 = 10 seconds ALSO SEE beep EXAMPLE sound_(5000,36); /* sounds a tone for 2 seconds */ ------------------------------------------------------------------------ NAME spc DESCRIPTION Displays a specified number of spaces to the screen using the text attribute of the character under the cursor. 58 SYNOPSIS #include "cxlvid.h" void spc(int num); INPUTS num - number of spaces to display ------------------------------------------------------------------------ NAME srestore DESCRIPTION Restores a previously saved screen, and frees the memory allocated by ssave(). SYNOPSIS #include "cxlvid.h" void srestore(int *sbuf); INPUTS sbuf - address of previously saved screen buffer ALSO SEE ssave ------------------------------------------------------------------------ NAME ssave DESCRIPTION Saves the current screen to a buffer. To work with monochrome video adapters, videoinit() must have previously been called. SYNOPSIS #include "cxlvid.h" int *ssave(void); RETURN VALUE Address of newly created screen buffer or NULL if a memory allocation error occurred. ALSO SEE scrntodisk srestore videoinit wsave EXAMPLE int *p; if((p=ssave())==NULL) { printf("Memory allocation error\n"); exit(1); } ------------------------------------------------------------------------ 59 NAME strblank DESCRIPTION Determines if a given string is blank (whitespace). SYNOPSIS #include "cxlstr.h" int strblank(char *str); INPUTS str - address of the string to check RETURN VALUE A zero if the string is not blank, otherwise it is. EXAMPLE char string1[]=" Hello "; char string2[]=" \n \t \r "; printf("string1 is %sblank\n",strblank(string1)?"":"not "); printf("string2 is %sblank\n",strblank(string2)?"":"not "); ------------------------------------------------------------------------ NAME strbmatch DESCRIPTION Returns the best match of a string in an array of strings. SYNOPSIS #include "cxlstr.h" char *strbmatch(char *str,char *strarr[]); INPUTS str - address of string to match strarr - address of array of string pointers. The last pointer in the array must be NULL. RETURN VALUE Address of the string in the array that best matched the given string. ALSO SEE strmatch EXAMPLE char *strings[]= { "Hello","There","Computer","World",NULL }; char str1[]="xhelpx"; printf("<%s> best matches <%s>\n",str1,strbmatch(str1,strings)); ------------------------------------------------------------------------ NAME 60 strbtrim DESCRIPTION Trims both leading and trailing spaces off of a string. SYNOPSIS #include "cxlstr.h" char *strbtrim(char *str); INPUTS The address of the string to modify. RETURN VALUE The address of the modified string. ALSO SEE strltrim strtrim EXAMPLE char str[]=" Hello "; printf("Before: <%s>\n",str); strbtrim(str); printf("After: <%s>\n",str); ------------------------------------------------------------------------ NAME strchg DESCRIPTION Finds all letters in a string matching one character and replaces them with another. SYNOPSIS #include "cxlstr.h" int strchg(char *str,int oldch,int newch); INPUTS str - address of string to search oldch - character to search for newch - character to replace with RETURN VALUE The number of matches found. ALSO SEE strichg EXAMPLE char str[]="Hello, world"; printf("Before: %s\n",str); strchg(str,'l','z'); printf("After: %s\n",str); 61 ------------------------------------------------------------------------ NAME strchksum DESCRIPTION Returns the checksum of a string. The checksum is calculated by adding up the ASCII values of each character in the string. SYNOPSIS #include "cxlstr.h" unsigned long strchksum(char *str); INPUTS str - address of the string RETURN VALUE The checksum of the input string. ALSO SEE strichksum EXAMPLE printf("The checksum of is %lu\n",strchksum("Hello")); ------------------------------------------------------------------------ NAME strcode DESCRIPTION Encrypts/decrypts a string. Call this function to encrypt a string, then call again using the same key to decrypt it. When reading or writing from a disk file, be sure to open the file in binary mode. SYNOPSIS #include "cxlstr.h" char *strcode(char *str,char *key); INPUTS str - the address of the string to encrypt/decrypt key - the address of the key string to encrypt/decrypt with. The string can consist of any valid characters (01-FF) and can be of any length. Remember this key or your data will be lost forever! RETURN VALUE The address of the encrypted/decrypted string. ALSO SEE fcrypt EXAMPLE char str[]="Hello, world"; 62 printf("Before: %s\n",str); strcode(str,"34&*#Mdq"); printf("Encrypted: %s\n",str); strcode(str,"34&*#Mdq"); printf("Decrypted: %s\n",str); ------------------------------------------------------------------------ NAME strdel DESCRIPTION Deletes a substring from within a string. SYNOPSIS #include "cxlstr.h" char *strdel(char *substr,char *str); INPUTS substr - address of substring to delete str - address of string to delete substring from RETURN VALUE A NULL if the substring was not found, or the address of the modified string. ALSO SEE strdela stridel stridela strinc strins strmid EXAMPLE char str[]="Hello there, world"; printf("Before: %s\n",str); strdel(" there",str); printf("After: %s\n",str); ------------------------------------------------------------------------ NAME strdela DESCRIPTION Deletes all occurrences of a substring from within a string. SYNOPSIS #include "cxlstr.h" char *strdela(char *substr,char *str); INPUTS substr - the address of the substring to search for str - the address of string to search RETURN VALUE The address of the modified string, or a NULL if no matches were found. 63 ALSO SEE strdel stridel stridela EXAMPLE char str[]="xyzHello, xyzworldxyz"; printf("Before: <%s>\n",str); strdela("xyz",str); printf("After: <%s>\n",str); ------------------------------------------------------------------------ NAME strichg DESCRIPTION Finds all letters in a string matching one character and replaces them with another. Ignores case of letters. SYNOPSIS #include "cxlstr.h" int strichg(char *str,int oldch,int newch); INPUTS str - address of string to search oldch - character to search for newch - character to replace oldch with RETURN VALUE The number of matches found. ALSO SEE strchg EXAMPLE char str[]="HelLo, worLd"; printf("Before: %s\n",str); strichg(str,'l','l'); printf("After: %s\n",str); ------------------------------------------------------------------------ NAME strichksum DESCRIPTION Returns the checksum of a string. The checksum is calculated by adding up the ASCII values of each character in the string. All lowercase letters will be counted as uppercase. SYNOPSIS #include "cxlstr.h" unsigned long strichksum(char *str); INPUTS 64 str - address of the string RETURN VALUE The checksum of the input string. ALSO SEE strchksum EXAMPLE printf("The checksum of is %lu\n",strichksum("Hello")); ------------------------------------------------------------------------ NAME stridel DESCRIPTION Deletes a substring from within a string. Ignores case of letters. SYNOPSIS #include "cxlstr.h" char *stridel(char *substr,char *str); INPUTS substr - address of substring to delete str - address of string to delete substring from RETURN VALUE A NULL if the substring was not found, or the address of the modified string. ALSO SEE strdel strdela stridela striinc EXAMPLE char str[]="Hello tHeRe, world"; printf("Before: %s\n",str); stridel(" ThErE",str); printf("After: %s\n",str); ------------------------------------------------------------------------ NAME stridela DESCRIPTION Deletes all occurrences of a substring from within a string. Ignores case of letters. SYNOPSIS #include "cxlstr.h" char *stridela(char *substr,char *str); INPUTS 65 substr - the address of the substring to search for str - the address of string to search RETURN VALUE The address of the modified string, or a NULL if no matches were found. ALSO SEE strdel strdela stridel EXAMPLE char str[]="XyZHello, xYzworldXyZ"; printf("Before: <%s>\n",str); strdela("xYz",str); printf("After: <%s>\n",str); ------------------------------------------------------------------------ NAME striinc DESCRIPTION Determines if and where one string is included within another. Ignores case of letters. SYNOPSIS #include "cxlstr.h" char *striinc(char *str1,char *str2); INPUTS str1 - address of the string to search for str2 - address of the string to search RETURN VALUE The address where string1 is included in string2, or a NULL if string1 is not included in string2. ALSO SEE strinc strmid EXAMPLE char str[]="Hello, world"; printf(" is %sincluded in <%s>\n" ,striinc("ElLo",str)==NULL?"not ":"",str); ------------------------------------------------------------------------ NAME strinc DESCRIPTION Determines if and where one string is included within another. SYNOPSIS 66 #include "cxlstr.h" char *strinc(char *str1,char *str2); INPUTS str1 - address of the string to search for str2 - address of the string to search RETURN VALUE The address where string1 is included in string2, or a NULL if string1 is not included in string2. ALSO SEE striinc strmid EXAMPLE char str[]="Hello, world"; printf(" is %sincluded in <%s>\n" ,strinc("ElLo",str)==NULL?"not ":"",str); ------------------------------------------------------------------------ NAME strins DESCRIPTION Inserts one string into another. SYNOPSIS #include "cxlstr.h" char *strins(char *instr,char *str,int st_pos); INPUTS instr - the address of the string to insert str - the address of the string to insert instr into. This area must be large enough to hold the size of the modified string. st_pos - the starting position of where to insert RETURN VALUE The address of the modified string. ALSO SEE strdel strinc EXAMPLE char str[20]="Hello, world"; printf("Before: %s\n",str); strins(" there",str,5); printf("After: %s\n",str); ------------------------------------------------------------------------ NAME striocc 67 DESCRIPTION Returns the number of occurrences of a character in a string. Ignores case of letters. SYNOPSIS #include "cxlstr.h" int striocc(char *str,int ch); INPUTS str - address of the string to search ch - the character to look for RETURN VALUE The number of occurrences of the character in the string. ALSO SEE strocc EXAMPLE char str[]="HelLo, world"; printf("There are %d occurrences of '%c' in <%s>\n" ,striocc(str,'l'),'l',str); ------------------------------------------------------------------------ NAME strischg DESCRIPTION Changes all occurrences of one string to another. Ignores case of letters. SYNOPSIS #include "cxlstr.h" char *strischg(char *str,char *find,char *replace); INPUTS str - address of the string to search find - address of the string to search for replace - address of the string to replace found strings with RETURN VALUE The address of the modified string, or NULL if no matches were found. ALSO SEE strisrep strschg strsrep EXAMPLE char str[]="xxxhElLoyyyHElLOzzz"; printf("Before: <%s>\n",str); strischg(str,"HeLlO","goodbye"); printf("After: <%s>\n",str); 68 ------------------------------------------------------------------------ NAME strisocc DESCRIPTION Counts occurrences of one string within another. Ignores case of letters. SYNOPSIS #include "cxlstr.h" int strisocc(char *str1,char *str2); INPUTS str1 - address of string to search for str2 - address of string to search RETURN VALUE The number of times that string str1 occurs in string str2. ALSO SEE strsocc EXAMPLE char str1[]="hello"; char str2[]="Hello1HELLO2HeLlO3hElLo"; printf("<%s> occurs in <%s> %d times\n",str1,str2 ,strisocc(str1,str2)); ------------------------------------------------------------------------ NAME strisrep DESCRIPTION Searches for, and replaces one string within another. Ignores case of letters. SYNOPSIS #include "cxlstr.h" char *strisrep(char *str,char *search,char *replace); INPUTS str - address of string to search. This must have enough space to hold the modified string. search - address of string to search for replace - address of string to replace search string with RETURN VALUE The address of the modified string, or NULL if the search string wasn't found. ALSO SEE strischg strschg strsrep 69 EXAMPLE char str[24]="This is a big string"; printf("Before: %s\n",str); strisrep(str,"StR","th"); printf("After: %s\n",str); ------------------------------------------------------------------------ NAME strleft DESCRIPTION Takes a specified portion of a string from its left and creates a new string. SYNOPSIS #include "cxlstr.h" char *strleft(char *str,int num_chars); INPUTS str - address of input string num_chars - number of characters to copy RETURN VALUE Address of the newly created string or a NULL if a memory allocation error occurred. Be sure to free() this string if or when you don't need it anymore. ALSO SEE strmid strright strtrim EXAMPLE char *p,str[]="Hello, world"; printf("%s\n",p=strleft(str,5)); free(p); ------------------------------------------------------------------------ NAME strljust DESCRIPTION Left justifies a text string. SYNOPSIS #include "cxlstr.h" char *strljust(char *str); INPUTS str - address of the string to left justify RETURN VALUE Address of the modified string. 70 ALSO SEE strrjust EXAMPLE char str[]=" Hello, world"; printf("Before: <%s>\n",str); strljust(str); printf("After: <%s>\n",str); ------------------------------------------------------------------------ NAME strltrim DESCRIPTION Trims the leading spaces off of a string. SYNOPSIS #include "cxlstr.h" char *strltrim(char *str); INPUTS str - address of the string to trim RETURN VALUE Address of the modified string. ALSO SEE strbtrim strright strsetsz strtrim EXAMPLE char str[]=" Hello, world"; printf("Before: <%s>\n",str); strltrim(str); printf("After: <%s>\n",str); ------------------------------------------------------------------------ NAME strmatch DESCRIPTION Compares 2 strings and returns a match score. SYNOPSIS #include "cxlstr.h" int strmatch(char *str1,char *str2); INPUTS str1 - address of first string str2 - address of second string RETURN VALUE A match score. The higher the score, the better they match. 71 ALSO SEE strbmatch ------------------------------------------------------------------------ NAME strmid DESCRIPTION Takes a section from input string starting at given position and taking the given amount of characters creating a new string. SYNOPSIS #include "cxlstr.h" char *strmid(char *str,int st_pos,int num_chars); INPUTS str - address of input string st_pos - position in input string to start copying characters (starting at position 0) num_chars - number of characters to copy RETURN VALUE Address of the newly created string or a NULL if a memory allocation error occurred. Be sure to free() the string when or if you are finished with it. ALSO SEE strleft strright EXAMPLE char *p,str[]="Hello there, world"; printf("%s\n",p=strmid(str,6,5)); free(p); ------------------------------------------------------------------------ NAME strocc DESCRIPTION Returns the number of occurrences of a given character in a string. SYNOPSIS #include "cxlstr.h" int strocc(char *str,int ch); INPUTS str - address of the string to search ch - the character to look for RETURN VALUE The number of occurrences of the given character in the string. 72 ALSO SEE striocc EXAMPLE char str[]="Hello, world"; printf("There are %d occurrences of '%c' in <%s>\n" ,strocc(str,'l'),'l',str); ------------------------------------------------------------------------ NAME strright DESCRIPTION Takes a specifed portion from the right side of a string creating a new string. SYNOPSIS #include #include "cxlstr.h" char *strright(char *str,int num_chars); INPUTS str - address of input string num_chars - number of characters to copy RETURN VALUE Address of the newly created string or a NULL if a memory allocation error occurred. Be sure to free() the string when or if you are finished with it. ALSO SEE strleft strltrim strmid EXAMPLE char *p,str[]="Hello, world"; printf("%s\n",p=strright(str,5)); free(p); ------------------------------------------------------------------------ NAME strrjust DESCRIPTION Right justifies a text string. SYNOPSIS #include "cxlstr.h" char *strrjust(char *str); INPUTS str - address of string to right justify 73 RETURN VALUE Address of modified string. ALSO SEE strljust EXAMPLE char str[]="Hello, world "; printf("Before: <%s>\n",str); strrjust(str); printf("After: <%s>\n",str); ------------------------------------------------------------------------ NAME strrol DESCRIPTION Rotates a string specified number of characters left. The rotated characters wrap around to the right side of the string. SYNOPSIS #include "cxlstr.h" char *strrol(char *str,int count); INPUTS str - the address of the string to rotate count - number of characters to rotate RETURN VALUE The address of the modified string. ALSO SEE strror strshl EXAMPLE char str[]="Hello, world"; printf("Before: <%s>\n",str); strrol(str,3); printf("After: <%s>\n",str); ------------------------------------------------------------------------ NAME strror DESCRIPTION Rotates a string specified number of characters right. The rotated characters wrap around to the left side of the string. SYNOPSIS #include "cxlstr.h" char *strror(char *str,int count); 74 INPUTS str - the address of the string to rotate count - number of characters to rotate RETURN VALUE The address of the modified string. ALSO SEE strrol strshr EXAMPLE char str[]="Hello, world"; printf("Before: <%s>\n",str); strror(str,3); printf("After: <%s>\n",str); ------------------------------------------------------------------------ NAME strschg DESCRIPTION Changes all occurrences of one string to another. SYNOPSIS #include "cxlstr.h" char *strschg(char *str,char *find,char *replace); INPUTS str - address of the string to search find - address of the string to search for replace - address of the string to replace found strings with RETURN VALUE The address of the modified string, or NULL if no matches were found. ALSO SEE strischg strisrep strsrep EXAMPLE char str[]="xxxhelloyyyhellozzz"; printf("Before: <%s>\n",str); strschg(str,"hello","goodbye"); printf("After: <%s>\n",str); ------------------------------------------------------------------------ NAME strsetsz DESCRIPTION Adjusts the length of a string, either by truncation or padding with spaces. 75 SYNOPSIS #include "cxlstr.h" char *strsetsz(char *str,int newsize); INPUTS str - address of the string to modify. This area must be large enough to hold the string at its newsize length. newsize - the new length of the string RETURN VALUE The address of the modified string. ALSO SEE strtrim EXAMPLE char str[22]="Hello, world"; printf("Before: <%s>\n",str); strsetsz(str,20); printf("Len=20: <%s>\n",str); strsetsz(str,5); printf("Len=5: <%s>\n",str); ------------------------------------------------------------------------ NAME strshl DESCRIPTION Shifts a string a specified number of characters left. Characters that shift past the beginning of the string "drop off" and spaces are added to the right of the string. SYNOPSIS #include "cxlstr.h" char *strshl(char *str,int count); INPUTS str - the address of the string to shift count - number of characters to shift RETURN VALUE The address of the modifed string. ALSO SEE strrol strshr EXAMPLE char str[]="Hello, world"; printf("Before: <%s>\n",str); strshl(str,3); printf("After: <%s>\n",str); ------------------------------------------------------------------------ 76 NAME strshr DESCRIPTION Shifts a string a specified number of characters right. Characters that shift past the end of the string "drop off" and spaces are added to the left of the string. SYNOPSIS #include "cxlstr.h" char *strshr(char *str,int count); INPUTS str - the address of the string to shift count - number of characters to shift RETURN VALUE The address of the modified string. ALSO SEE strror strshl EXAMPLE char str[]="Hello, world"; printf("Before: <%s>\n",str); strshr(str,3); printf("After: <%s>\n",str); ------------------------------------------------------------------------ NAME strsocc DESCRIPTION Counts the occurrences of one string within another. SYNOPSIS #include "cxlstr.h" int strsocc(char *str1,char *str2); INPUTS str1 - address of string to search for str2 - address of string to search RETURN VALUE The number of times that string str1 occurs in string str2. ALSO SEE strisocc EXAMPLE char str1[]="hello"; char str2[]="Hello1hello2HeLlO3hElLo"; printf("<%s> occurs in <%s> %d times\n",str1,str2 77 ,strsocc(str1,str2)); ------------------------------------------------------------------------ NAME strsrep DESCRIPTION Searches for, and replaces one string within another. SYNOPSIS #include "cxlstr.h" char *strsrep(char *str,char *search,char *replace); INPUTS str - address of string to search search - address of string to search for replace - address of string to replace search string with RETURN VALUE The address of the modified string, or NULL if the search string wasn't found. ALSO SEE strischg strisrep strschg EXAMPLE char str[24]="This is a big string"; printf("Before: %s\n",str); strsrep(str,"str","th"); printf("After: %s\n",str); ------------------------------------------------------------------------ NAME strtrim DESCRIPTION Trims trailing spaces off of a string. SYNOPSIS #include "cxlstr.h" char *strtrim(char *str); INPUTS str - address of the string to trim RETURN VALUE Address of the modified string. ALSO SEE strbtrim strleft strltrim strsetsz EXAMPLE 78 char str[]="Hello, world "; printf("Before: <%s>\n",str); strtrim(str); printf("After: <%s>\n",str); ------------------------------------------------------------------------ NAME struplow DESCRIPTION Converts a string to mixed upper & lowercase characters. Characters are forced to upper or lowercase depending upon the previous character in the string. SYNOPSIS #include "cxlstr.h" char *struplow(char *str); INPUTS str - the address of the string to convert RETURN VALUE The address of the modified string. ALSO SEE touplow EXAMPLE char str[]="hElLo, wOrLd"; printf("Before: <%s>\n",str); struplow(str); printf("After: <%s>\n",str); ------------------------------------------------------------------------ NAME sysdate DESCRIPTION Returns a string containing the current system date. SYNOPSIS #include "cxldef.h" char *sysdate(int dtype); INPUTS dtype - date type code. Can be one of the following: Code Example ---- ------- 0 December 3, 1988 1 3 Dec 88 2 12-3-88 3 12/3/88 79 4 3/12/88 5 12/03/88 RETURN VALUE The address of the static string containing the system date. ALSO SEE systime EXAMPLE printf("Today's date is %s\n",sysdate(0)); ------------------------------------------------------------------------ NAME systime DESCRIPTION Returns a string containing the current system time. SYNOPSIS #include "cxldef.h" char *systime(int ttype); INPUTS ttype - time type code. Can be one of the following: Code Example ---- ------- 0 16:30:57.89 1 16:30:57 2 4:30 PM 3 4:30p 4 4:30 5 04:30 RETURN VALUE The address of the static string containing the current system time. ALSO SEE sysdate EXAMPLE printf("The current time is %s\n",systime(2)); ------------------------------------------------------------------------ NAME tabstop DESCRIPTION Calculates a tab stop from given column and tab width. SYNOPSIS #include "cxldef.h" 80 int tabstop(int col,int tabwidth); INPUTS col - column tabwidth - tab width RETURN VALUE The next tab stop column. EXAMPLE printf("The next tab stop after column 9 is column %d\n" ,tabstop(9,8)); ------------------------------------------------------------------------ NAME timer DESCRIPTION Returns the value of the BIOS timer. This value is incremented by one every 18.2 seconds. SYNOPSIS #include "cxldef.h" unsigned long timer(void); RETURN VALUE Current value of the BIOS timer. ALSO SEE delay_ EXAMPLE printf("Time #1: %lu\n",timer()); delay_(36); printf("Time #2: %lu\n",timer()); ------------------------------------------------------------------------ NAME touplow DESCRIPTION Converts a character to upper or lowercase depending on previous character. This function is used internally by other CXL functions. SYNOPSIS #include "cxlstr.h" int touplow(char *str,char *pos,int ch); INPUTS str - address of string pos - address of current position in string ch - character to convert 81 RETURN VALUE The converted character. ALSO SEE struplow EXAMPLE char ch='w',str[20]="Hello, "; printf("The character '%c' will be appended to <%s> as '%c'\n" ,ch,str,touplow(str,str+7,ch)); ------------------------------------------------------------------------ NAME videoinit DESCRIPTION Initializes CXL's video system. By default, all CXL functions performing direct screen writes go to the CGA screen memory at address B800:0000. If you want these functions to work correctly with a monochrome video adapter or within a DESQview window, you must call this function. This function sets the values in the global structure variable _vinfo. SYNOPSIS #include "cxlvid.h" int videoinit(void); RETURN VALUE Video adapter type. See the vidtype() description for all the possible return values. ALSO SEE setvparam vidtype ------------------------------------------------------------------------ NAME vidmode DESCRIPTION Returns the current video mode. SYNOPSIS #include "cxlvid.h" int vidmode(void); RETURN VALUE The current video mode. ALSO SEE mode ------------------------------------------------------------------------ 82 NAME vidtype DESCRIPTION Determines the display adapter type. SYNOPSIS #include "cxlvid.h" int vidtype(void); RETURN VALUE Video adapter type. Will be one of the following values: V_NONE - no video adapter V_MDA - Monochrome Display Adapter V_EGAMONO - Enhanced Graphics Adapter in mono mode V_MCGAMONO - Multi-Color Graphics Array adapter in mono mode V_VGAMONO - Video Graphics Array adapter in mono mode V_HGC - Hercules Graphics Card V_HGCPLUS - Hercules Graphics Card Plus V_INCOLOR - Hercules InColor Card V_CGA - Color Graphics Adapter V_EGA - Enhanced Graphics Adapter V_MCGA - Multi-Color Graphics Array adapter V_VGA - Video Graphics Array adapter ALSO SEE mode setvparam videoinit ------------------------------------------------------------------------ NAME wactiv DESCRIPTION Activates a previously opened window, bringing it "in front" of all the others. Many windowing functions can perform their operations only on the active window. If a window is not active, you will need to activate it before you can use it for these functions. SYNOPSIS #include "cxlwin.h" int wactiv(WINDOW whandle); INPUTS whandle - the window handle of the window to activate RETURN VALUE W_NOERROR - no error W_NOTFOUND - window handle not found W_NOACTIVE - no open windows ALSO SEE wisactiv wopen 83 EXAMPLE int w1,w2; w1=wopen(10,10,20,40,0,LCYAN|_BLUE,LCYAN|_BLUE); w2=wopen(0,0,15,35,1,LMAGENTA|_RED,LMAGENTA|_RED); wactiv(w1); ------------------------------------------------------------------------ NAME waitkey DESCRIPTION Clears the keyboard buffer and halts program execution until a key is pressed. SYNOPSIS #include "cxlkey.h" int waitkey(void); RETURN VALUE The ASCII value of the key pressed. ALSO SEE clearkeys getchf waitkeyt EXAMPLE printf("Press any key to continue...."); waitkey(); ------------------------------------------------------------------------ NAME waitkeyt DESCRIPTION Clears the keyboard buffer and halts program execution until a key is pressed or the specified time limit expires. SYNOPSIS #include "cxlkey.h" int waitkeyt(int duration); INPUTS duration - length of time to wait for keypress (ie. 182 = 10 secs.) RETURN VALUE The ASCII value of the key pressed or a -1 if the time limit expired. ALSO SEE clearkeys delay_ getchf waitkey EXAMPLE printf("Press any key to continue...."); 84 waitkeyt(91); /* time out after 5 seconds */ ------------------------------------------------------------------------ NAME wborder DESCRIPTION Changes the active window's border box type. If changing to or from a borderless window, the window's effective area will change as well, changing relative coordinates within the window. SYNOPSIS #include "cxlwin.h" int wborder(int btype); INPUTS btype - box type. Can be one of the following: 0 - single line border 1 - double line border 2 - single horz, double vert line border 3 - double horz, single vert line border 4 - thick line border 5 - no border (uses spaces for border chars) RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_INVBTYPE - invalid box type ------------------------------------------------------------------------ NAME wbox DESCRIPTION "Draws" a text box in the active window. SYNOPSIS #include "cxlwin.h" int wbox(int wsrow,int wscol,int werow,int wecol,int btype, int attr); INPUTS wsrow - window start row of box wscol - window start column of box werow - window end row of box wecol - window end column of box btype - box type. Can be one of the following: 0 - single line border 1 - double line border 2 - single horz, double vert line border 3 - double horz, single vert line border 4 - thick line border 85 5 - no border (uses spaces for border chars) attr - text attribute to use for box characters RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_INVCOORD - invalid coordinates ALSO SEE wfill whline wvline ------------------------------------------------------------------------ NAME wbprintc DESCRIPTION Displays a character on a window's border. SYNOPSIS #include "cxlwin.h" int wbprintc(int bord,int offs,int attr,int ch); INPUTS bord - border code. Can be one of the following: TP_BORD - top border BT_BORD - bottom border LT_BORD - left border RT_BORD - right border offs - offset from window border to display character at attr - text attribute for displayed character ch - the character to display RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_NOBORDER - window has no border W_INVCOORD - border offset out of range ALSO SEE wmessage wprintc EXAMPLE wbprintc(RT_BORD,1,WHITE|_BLACK,'*'); ------------------------------------------------------------------------ NAME wcclear DESCRIPTION Clears the active window using specified text attribute, then homes the cursor. 86 SYNOPSIS #include "cxlwin.h" int wcclear(int attr); INPUTS attr - text attribute to clear window with RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window ALSO SEE wclear wclreol wclreos wfillch EXAMPLE wcclear(BLACK|_BLACK); ------------------------------------------------------------------------ NAME wcenters DESCRIPTION Displays a string centered in active window. Does not recognize control characters. Does not update cursor position. SYNOPSIS #include "cxlwin.h" int wcenters(int wrow,int attr,char *str); INPUTS wrow - window row to center string at attr - text attribute to use for displayed characters str - address of string to display RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_INVCOORD - invalid window row W_STRLONG - string too long to be centered in window ALSO SEE wprints wrjusts EXAMPLE wcenters(2,YELLOW|_LGREY,"Main Menu"); ------------------------------------------------------------------------ NAME wchgattr DESCRIPTION Changes the text attribute of the active window. All text within 87 the window will be changed also. SYNOPSIS #include "cxlwin.h" int wchgattr(int battr,int wattr); INPUTS battr - the attribute to make the window's border wattr - the attribute to make the window RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window ALSO SEE wtextattr EXAMPLE wchgattr(LMAGENTA|_RED,LCYAN|_BLUE); ------------------------------------------------------------------------ NAME wchkbox DESCRIPTION Determines whether input window box coordinates are valid for use in the active window. SYNOPSIS #include "cxlwin.h" int wchkbox(int wsrow,int wscol,int werow,int wecol); INPUTS wsrow - window start row wscol - window start column werow - window end row wecol - window end column RETURN VALUE Nonzero if input window box coordinates are invalid. ALSO SEE wchkcol wchkcoord wchkrow ------------------------------------------------------------------------ NAME wchkcol DESCRIPTION Determines whether input window column coordinate is valid for use in the active window. 88 SYNOPSIS #include "cxlwin.h" int wchkcol(int wcol); INPUTS wcol - window column RETURN VALUE Nonzero if input window column coordinate is invalid. ALSO SEE wchkbox wchkcoord wchkrow ------------------------------------------------------------------------ NAME wchkcoord DESCRIPTION Determines whether input window row,column coordinates are valid for use in the active window. SYNOPSIS #include "cxlwin.h" int wchkcoord(int wrow,int wcol); INPUTS wrow - window row wcol - window column RETURN VALUE Nonzero if input window coordinates are invalid. ALSO SEE wchkbox wchkcol wchkrow ------------------------------------------------------------------------ NAME wchkrow DESCRIPTION Determines whether input window row is valid for use in the active window. SYNOPSIS #include "cxlwin.h" int wchkrow(int wrow); INPUTS wrow - window row RETURN VALUE Nonzero if input window row is invalid. 89 ALSO SEE wchkbox wchkcol wchkcoord ------------------------------------------------------------------------ NAME wclear DESCRIPTION Clears the active window, then homes the cursor. SYNOPSIS #include "cxlwin.h" int wclear(void); RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window ALSO SEE wcclear wclreol wclreos wfillch ------------------------------------------------------------------------ NAME wclose DESCRIPTION Closes the active window. If the window has a shadow, it will be closed as well. SYNOPSIS #include "cxlwin.h" int wclose(void); RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window ALSO SEE wcloseall wopen wunlink ------------------------------------------------------------------------ NAME wcloseall DESCRIPTION Closes all open windows. SYNOPSIS #include "cxlwin.h" int wcloseall(void); 90 RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window ALSO SEE wclose wopen ------------------------------------------------------------------------ NAME wclreol DESCRIPTION Clears from the cursor to the end of the active window's line. The cursor's position is not updated. SYNOPSIS #include "cxlwin.h" int wclreol(void); RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window ALSO SEE wclear wclreos wfillch ------------------------------------------------------------------------ NAME wclreos DESCRIPTION Clears from the cursor to the end of the active window. The cursor's position is not updated. SYNOPSIS #include "cxlwin.h" int wclreos(void); RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window ALSO SEE wclear wclreol wfillch ------------------------------------------------------------------------ NAME wcopy DESCRIPTION Creates a new window duplicating the active window. The new window 91 becomes the active window. SYNOPSIS #include "cxlwin.h" WINDOW wcopy(int nsrow,int nscol); INPUTS nsrow - start row of where to place the duplicate window nscol - start column of where to place the duplicate window RETURN VALUE The window handle of the new window. If an error occurred, a zero will be returned and the global variable _winfo.errno will be set to one of the following values: W_ALLOCERR - memory allocation error W_INVCOORD - invalid coordinates ALSO SEE wactiv wmove wopen EXAMPLE wopen(10,10,20,40,0,LCYAN|_BLUE,LCYAN|_BLUE); wcopy(0,0); ------------------------------------------------------------------------ NAME wdelline DESCRIPTION Deletes a line from the active window. Depending upon the input scroll direction, the lines above or below the line to delete will scroll to fill in the deleted line in, and a blank line will be added. If what you really want to do is clear the line, you may want to use wclreol() instead. SYNOPSIS #include "cxlwin.h" int wdelline(int wrow,int direc); INPUTS wrow - window row to delete direc - scroll direction. Can be one of the following: D_UP - scroll up D_DOWN - scroll down RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_INVCOORD - invalid window row ALSO SEE wclreol winsline wscroll 92 EXAMPLE wdelline(3,D_UP); ------------------------------------------------------------------------ NAME wdrag DESCRIPTION Smoothly drag active window one row/column in given direction. SYNOPSIS #include "cxlwin.h" int wdrag(int direction); INPUTS direction - direction to drag window. Can be one of these values: D_UP - up D_DOWN - down D_LEFT - left D_RIGHT - right RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_ALLOCERR - memory allocation error ALSO SEE wmove wslide ------------------------------------------------------------------------ NAME wdump DESCRIPTION Dumps the active window to the default printer (PRN). SYNOPSIS #include "cxlwin.h" int wdump(void); RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window ALSO SEE windump ------------------------------------------------------------------------ NAME wdupc 93 DESCRIPTION Displays a character a specified number of times in the active window. Characters will be displayed in the window's current text attribute. Control characters are recognized. Cursor position is updated. SYNOPSIS #include "cxlwin.h" int wdupc(int ch,int count); INPUTS ch - character to be displayed count - number of times to display character RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window ALSO SEE wdups wputc wtextattr EXAMPLE wdupc('X',5); ------------------------------------------------------------------------ NAME wdups DESCRIPTION Displays a string a specified number of times in the active window. Characters will be displayed in the window's current text attribute. Control characters are recognized. Cursor position is updated. SYNOPSIS #include "cxlwin.h" int wdups(char *str,int count); INPUTS str - character to be displayed count - number of times to display character RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window ALSO SEE wdupc wputs wtextattr EXAMPLE wdups("Hello ",3); ------------------------------------------------------------------------ 94 NAME werrmsg DESCRIPTION Most of CXL's windowing functions set the global variable _winfo.errno before returning to their caller. This function, werrmsg(), reads _winfo.errno and returns the literal error message that corresponds to it. This can be very useful in debugging programs that use CXL's windowing functions. Check the individual windowing function descriptions to find out which ones actually set _winfo.errno. SYNOPSIS #include "cxlwin.h" char *werrmsg(void); RETURN VALUE The address of the static string containing the error message that corresponds to the window error code in _winfo.errno. ALSO SEE wperror EXAMPLE wgotoxy(255,255); /* invalid coordinates */ printf("Error = %s\n",werrmsg()); ------------------------------------------------------------------------ NAME wfill DESCRIPTION Fills in a region of active window with a specified character and attribute. SYNOPSIS #include "cxlwin.h" int wfill(int wsrow,int wscol,int werow,int wecol,int ch,int attr); INPUTS wsrow - window start row wscol - window start column werow - window end row wecol - window end column ch - character to fill with attr - text attribute to use for fill RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_INVCOORD - invalid coordinates ALSO SEE 95 wbox EXAMPLE wfill(2,3,5,15,'Z',WHITE|_GREEN); ------------------------------------------------------------------------ NAME wfillch DESCRIPTION Specifies which character the windowing system will use for filling windows with. By default, it is a space (' '). SYNOPSIS #include "cxlwin.h" void wfillch(int ch); INPUTS ch - character to fill with EXAMPLE wfillch('\260'); ------------------------------------------------------------------------ NAME wfindrec DESCRIPTION Finds the address of a window record using the specified window handle. This is used internally be several CXL functions. SYNOPSIS #include "cxlwin.h" struct _wrec_t *wfindrec(WINDOW whandle); INPUTS whandle - window handle of window record to find RETURN VALUE The address of the found window record, or NULL if no record was found for the given handle. ------------------------------------------------------------------------ NAME wgetc DESCRIPTION Gets a character from the keyboard. Entered character will be echoed to the active window using the window's current text attribute. Cursor position is updated. 96 SYNOPSIS #include "cxlwin.h" int wgetc(void); RETURN VALUE The ASCII value of the key pressed or a zero if an error occurred. If error, the global variable _winfo.errno will be set to one of the following: W_NOACTIVE - no active window ALSO SEE wgetchf wscanf wtextattr ------------------------------------------------------------------------ NAME wgetchf DESCRIPTION Gets a character from the keyboard. Allows input only of characters listed in the string of valid characters. Entered characters will be echoed to the active window using the text attribute set by the wtextattr() function. Cursor position is updated. Escape checking is provided by default. This can be turned off with the wsetesc() function. SYNOPSIS #include "cxlwin.h" int wgetchf(char *valid,int defchar); INPUTS valid - address of the string containing the valid characters defchar - default selection in case [Enter] is pressed, or a zero for none RETURN VALUE The ASCII value of the key pressed, or a zero if an error occurred. Thre returned character will be uppercase. If error, the global variable _winfo.errno will be set to one of the following: W_NOACTIVE - no active window W_ESCPRESS - [Esc] key was pressed ALSO SEE wgetc wgetyn wscanf wtextattr EXAMPLE int ch; wputs("Quit, are you sure? "); if((ch=wgetchf("YN",'N'))==0) wprintf("Error: %s\n",werrmsg()); ------------------------------------------------------------------------ NAME wgetns 97 DESCRIPTION Gets a string from the keyboard, limiting the number of characters input to the specified length. Entered characters will be echoed to the active window using the text attribute set by the wtextattr() function. Cursor position is updated. Escape checking is provided by default. This can be turned off with the wsetesc() function. SYNOPSIS #include "cxlwin.h" int wgetns(char *str,int maxlen); INPUTS str - address of the buffer to receive the input string maxlen - the maximum length of the input string RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_ESCPRESS - [Esc] key was pressed ALSO SEE wgets winputsf wscanf wsetesc wtextattr EXAMPLE char buf[6]; wputs("Enter 5 characters: "); if(wgetns(buf,5)) wprintf("Error: %s\n",werrmsg()); ------------------------------------------------------------------------ NAME wgets DESCRIPTION Gets a string from the keyboard. Entered characters will be echoed to the active window in the text attribute set by the wtextattr() function. Cursor position is updated. SYNOPSIS #include "cxlwin.h" int wgets(char *str); INPUTS str - the address of the buffer to receive the input string RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window ALSO SEE wgetns winputsf wscanf wtextattr EXAMPLE char name[30]; 98 wputs("Enter your name: "); wgets(name); ------------------------------------------------------------------------ NAME wgetyn DESCRIPTION Gets a [Y]es or [N]o response from the keyboard. When the user chooses [Y]es or [N]o, the text "Yes" or "No" will be displayed at the cursor location. Escape checking is provided by default. This can be turned off with the wsetesc() function. SYNOPSIS #include "cxlwin.h" int wgetyn(int cdefault); INPUTS cdefault - the response that will be automatically selected when the [Enter] key is pressed. Zero = No, Nonzero = Yes. RETURN VALUE A 'Y' if Yes was selected, an 'N' if No was selected, or a '\0' if the user pressed [Esc] and Escape checking was on. ALSO SEE wgetchf wsetesc EXAMPLE int choice; wputs("Delete, are you sure? [Y,n]: "); choice=wgetyn(1); if(choice) wprintf("\nYou selected: %c\n",choice); else wprintf("\n[Esc] was pressed\n"); ------------------------------------------------------------------------ NAME wgotoxy DESCRIPTION Sets cursor coordinates within the active window. SYNOPSIS #include "cxlwin.h" int wgotoxy(int wrow,int wcol); INPUTS wrow - window row (Y coordinate) wcol - window column (X coordinate) 99 RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_INVCOORD - invalid coordinates ALSO SEE wpgotoxy wreadcur ------------------------------------------------------------------------ NAME whandle DESCRIPTION Returns the window handle of the active window. SYNOPSIS #include "cxlwin.h" WINDOW whandle(void); RETURN VALUE The handle of the active window or zero if error. If error, the global variable _winfo.errno will be set to one of the following: W_NOACTIVE - no active window ALSO SEE wactiv wisactiv ------------------------------------------------------------------------ Context-Sensitive Help Functions CXL's context-sensitive help system operates on the principle of a current help category and a help category stack. Both require some explaining before you begin to use them. The current help category is the one that will be used when the user presses the help key. It can be set by one of several ways. The direct way is for you to explicitly set it by calling whelpcat(). There are also indirect ways that the current help category can be set. Windows, input fields, and menu items each have individual help categories as part of their record. If you were to activate a window which has its own help category, then that would become the current help category. During the processing of input fields and menus, each time you move to a new field or menu item item, the current help category is set to the whatever the field/item's help category is, even if that category is zero (empty). This means that input forms and menus overwrite what was in the current help category before the form/menu began processing. To keep from losing the current help category during the processing of forms and menus, you need to be able to save the current help category during that period. This is where the help stack comes into the picture. To save the current help category, you push it onto the stack with whelpush(). When you need to retrieve it, you pop it back off of 100 the stack using whelpop(). The category popped off of the stack then becomes the current help category. This help stack is a LIFO (Last In First Out) stack and holds up to 20 help categories. When the help key is pressed by the user, CXL's help processor will search the help file for the current help category. If the current help category is zero (empty), then the help category off top of the stack will be used. This is where the help stack comes in handy. It allows you to have a "background" help category for menu items and fields that don't have help categories of their own. Before processing of the form or menu, you simply push the background help category onto the stack. When the help category is found in the help file, the corresponding help text will be displayed on the screen in the help window. If there is more than 1 page of text, the user can change between pages via the [PgUp]/[PgDn] keys. If there are cross-reference items, the user can use the arrow keys to move between them, and use [Enter] to select. Pressing [Esc] will exit the help window. During help processing, all keys attached to functions via setonkey() will be disabled to avoid conflict with the help system. If you wish to have defined keys available during help processing, you can define them using setonkey() in the "open" function specified in the whelpdef() function. If you define any keys in the "open" function, you will not need to worry about freeing them as the help processor will free any user-defined keys before exiting help. The size and placement of the help window are adjustable. The help window size by default is 19 rows by 64 columns centered on the screen. This can be changed using whelpwin(). The whelpwin() function sets the screen coordinates to be used when opening the help window and can be called any time after whelpdef(). If you ever want to disengage the help system, just call whelpundef(). Creating help files is quite easy. You need to have an ASCII editor to create them with. Your help file can contain several help categories. Here is an example of a couple of defined help categories: *B 1,Help Category 1 help text help text help text help text help text help text help text help text help text *P help text help text help text help text help text help text help text help text help text *E *B 2,Help Category 2 help text help text help text help text help text help text help text help text help text *P help text help text help text 101 help text help text help text help text help text help text Also see: ^Help Category 1^ *E The "*B" indicator specifies the beginning of a help category. The format is "*B helpcatnumber[,helpcatname]". The help category number is the number of the help category that you set using whelpcat(). There should be only one space between the "*B" and the help category number. The help category name is only required for cross-references. If there are no cross-references to that help category, then you can leave the helpcatname parameter out. The "*P" indicator specifies a page break and is optional. You may have as many page breaks as you'd like. The "*E" indicator specifies the end of the help category. The "*B", "*P", and "*E" indicators must all begin in the first column. These indicators and the help category name are case insensitive (can be in lowercase, uppercase, or mixed). CXL represents help categories as integers. When assigning help category numbers in the help file, you should start at 1 and go up from there. Help category 0 is reserved to represent an empty help category. In the definition of Help Category 2, you will notice the cross- reference to Help Category 1. All cross-referencing is done by embedding the cross-reference category name (not number) inside carats (^). If you need to display a carat inside the help file, use a double carat (^^). Any text contained outside of the "*B" and "*E" will be treated as comments. If an "*E" is not found, then the end-of-file will be treated as an "*E". Now, you need to "compile" your ASCII help file into an indexed file. There is utility, MAKEINDX.COM, which takes your ASCII help file as input, and outputs an indexed version of of the same file. This new file is the actual help file that you specify in the whelpdef() function. Keep the ASCII help file around so you will be able to make modifications. ------------------------------------------------------------------------ NAME whelpcat DESCRIPTION Sets the current help category. If a window is active at the time, it will also set that window's help category. The help category set by calling this function is what will be used by the help processor for searching the help file for help text. SYNOPSIS #include "cxlwin.h" int whelpcat(int cat); 102 INPUTS cat - help category number. RETURN VALUE W_NOERROR - no error W_NOHLPDEF - no help record defined ALSO SEE whelpclr whelpdef whelpop whelppcat whelpush ------------------------------------------------------------------------ NAME whelpclr DESCRIPTION Clears the help category stack. SYNOPSIS #include "cxlwin.h" int whelpclr(void); RETURN VALUE W_NOERROR - no error W_NOHLPDEF - no help defined ALSO SEE whelpdef whelpcat whelpop whelpush ------------------------------------------------------------------------ NAME whelpdef DESCRIPTION Defines the help file, key, and window colors. After calling this function, anytime the help key is pressed, the help processor will search the help file for whatever the current help category is. SYNOPSIS #include "cxlwin.h" int whelpdef(char *file,unsigned key,int winattr,int textattr, int selattr,int barattr,void (*open)(void)); INPUTS file - address of string containing help file name. key - keycode of key to be used for help key. See Appendix B for a list of keycodes that you can use. winattr - attribute of the help window. textattr - attribute of the text in the help window. selattr - attribute of the cross-reference selection text. barattr - attribute of the cross-reference selection bar. open - address of the function to call immediately upon opening of the help window. This can be used to call a function 103 that could add a window shadow, etc. If you do not need to use this feature, specify NULL. RETURN VALUE W_NOERROR - no error W_ALLOCERR - memory allocation error W_NOHLPDEF - you specified NULL for the help file name ALSO SEE whelpcat whelpundef whelpwin EXAMPLE whelpdef("CXLDEMO.HLP",0x3b00,LCYAN|_BLUE,GREEN|_BLUE,LGREEN|_BLUE ,BLUE|_LGREY,NULL); ------------------------------------------------------------------------ NAME whelpop DESCRIPTION Pops the help category off of the top of the stack and makes it the current help category. SYNOPSIS #include "cxlwin.h" int whelpop(void); RETURN VALUE W_NOERROR - no error W_NOHLPDEF - no defined help, see whelpdef(). W_HLPSTKUN - help stack underflow (stack empty). ALSO SEE whelpcat whelpclr whelpdef whelpopc whelpush whelpushc ------------------------------------------------------------------------ NAME whelpopc DESCRIPTION Pops the help category off of the top of the stack and into the void. The current help category is not affected. SYNOPSIS #include "cxlwin.h" int whelpopc(void); RETURN VALUE W_NOERROR - no error W_NOHLPDEF - no defined help, see whelpdef(). W_HLPSTKUN - help stack underflow (stack empty). 104 ALSO SEE whelpcat whelpclr whelpdef whelpop whelpush whelpushc ------------------------------------------------------------------------ NAME whelppcat DESCRIPTION Pushes the current help category onto the help category stack, then sets the current help category to the specified help category. It's effectively the same as doing a whelpush() followed by a whelpcat(). SYNOPSIS #include "cxlwin.h" int whelppcat(int cat); INPUTS cat - help category number of the help category you want to make the current help category. RETURN VALUE W_NOERROR - no error W_NOHLPDEF - no help record defined W_HLPSTKOV - help stack overflow (stack full) ALSO SEE whelpcat whelpush whelpushc ------------------------------------------------------------------------ NAME whelpush DESCRIPTION Pushes the current help category onto the help category stack. The stack can hold up to 20 help categories. SYNOPSIS #include "cxlwin.h" int whelpush(void); RETURN VALUE W_NOERROR - no error W_NOHLPDEF - no defined help. See whelpdef(). W_HLPSTKOV - help stack overflow (stack full). ALSO SEE whelpcat whelpclr whelpdef whelpop whelppcat whelpushc ------------------------------------------------------------------------ NAME whelpushc 105 DESCRIPTION Pushes the specified help category onto the help category stack. The current help category is not affected. The stack can hold up to 20 help categories. SYNOPSIS #include "cxlwin.h" int whelpushc(int cat); INPUTS cat - help category number to push onto help category stack. RETURN VALUE W_NOERROR - no error W_NOHLPDEF - no defined help. See whelpdef(). W_HLPSTKOV - help stack overflow (stack full). ALSO SEE whelpclr whelpdef whelpop whelpopc whelppcat whelpush ------------------------------------------------------------------------ NAME whelpundef DESCRIPTION Disengages the help system. This un-defines the help key, clears the help stack, and frees any memory allocated by the help system. SYNOPSIS #include "cxlwin.h" int whelpundef(void); RETURN VALUE W_NOERROR - no error W_NOHLPDEF - no help defined. See whelpdef(). ALSE SEE whelpdef ------------------------------------------------------------------------ NAME whelpwin DESCRIPTION Sets specific features to be used by the help window for when it opens. These are screen coordinates, border type, and whether or not to display a "Help" title on the upper window border. It does not actually open the help window. You can call whelpwin() anytime after calling whelpdef(). You can call whelpwin() as often as you like during your program. SYNOPSIS 106 #include "cxlwin.h" int whelpwin(int srow,int scol,int erow,int ecol,int btype, int title); INPUTS srow - start row to be used for help window scol - start column to be used for help window erow - end row to be used for help window ecol - end column to be used for help window btype - box type (0-5) to be used for help window title - display "Help" title on top border? (0=no, 1=yes) RETURN W_NOERROR - no error W_NOHLPDEF - no help defined, see whelpdef() ALSO SEE whelpdef ------------------------------------------------------------------------ NAME whide DESCRIPTION Hides the active window. The next window becomes active. SYNOPSIS #include "cxlwin.h" int whide(void); RETURN VALUE W_NOERROR - no error W_ALLOCERR - memory allocation error W_NOACTIVE - no active window ALSO SEE whandle wunhide ------------------------------------------------------------------------ NAME whline DESCRIPTION "Draws" a horizontal text line in active window using characters defined by given box type. If horizontal line crosses a vertical line of the same box type, an appropriate intersection or corner will be used. SYNOPSIS #include "cxlwin.h" int whline(int wsrow,int wscol,int count,int btype,int attr); 107 INPUTS wsrow - window start row wscol - window start column count - number of line characters to display btype - box type. Can be one of the following: 0 - single line 1 - double line 2 - single horz, double vert line 3 - double horz, single vert line 4 - thick line 5 - uses spaces for line chars attr - text attribute to use for the line RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_INVCOORD - text line too long for window W_INVBTYPE - invalid box type ALSO SEE wvline EXAMPLE whline(1,0,5,LMAGENTA|_BLACK); ------------------------------------------------------------------------ NAME windowat DESCRIPTION Returns the handle of the window at given screen row,column coordinates. SYNOPSIS #include "cxlwin.h" WINDOW windowat(int row,int col); INPUTS row - screen row col - screen column RETURN VALUE The window handle of the window found at given coordinates. If an error occurred, zero will be returned and _winfo.errno will be set to one of the following: W_NOACTIVE - no active window W_NOTFOUND - no window found at given screen coordinates ALSO SEE whandle ------------------------------------------------------------------------ 108 NAME windump DESCRIPTION Dumps a screen window to the printer (PRN). SYNOPSIS #include "cxlprn.h" void windump(int srow,int scol,int erow,int ecol); INPUTS srow - start row scol - start column erow - end row ecol - end column ALSO SEE wdump EXAMPLE windump(0,0,9,79); /* prints top 10 lines of screen */ ------------------------------------------------------------------------ Multi-Field Input Functions Three functions are needed to process multi-field formatted input from windows: winpbeg(), winpdef(), and winpread(). The winpbeg() function marks the start of an input form. The winpdef() function defines an input field and is called for each input field to be defined. The winpread() function marks the end of the input form and processes all defined fields. The formatted input capabilities are much like those of the inputsf() and winputsf() functions. The major difference is that with the winpbeg()/winpdef()/winpread() combination, you can edit back and forth between fields before finally accepting the input. For every input field you want to define, you must call winpdef(). This will allocate memory to hold the input record information. The first two parameters, wrow and wcol, specify where in the active window the field will be loaded. The next parameter, str, is the address of the string buffer to receive the input data. The edited string will be terminated with a '\0'. This means if your format string is "AAAAA", your receiving field must be string[6] to hold the terminating '\0'. You can edit numeric information as well. There are 4 conversion functions to convert numbers to/from CXL fields: cvtic() - convert integer to CXL field string cvtci() - convert CXL field string to integer cvtfc() - convert real number to CXL field string cvtcf() - convert CXL field string to real number The next parameter, format, is the input field format string. It 109 controls how each character is input and how large the input field will be. It consists of 1 or more format characters, and may have displayed text in between any of the format control characters. You may use spaces in between the format control characters for readability. Valid format control characters are listed in the "Formatted Keyboard Input Functions" section. The case of the format control characters must be as shown. You can also specify a decimal point in the field. Format strings for winpdef() are just like those of inputsf() and winputsf() except there are no command toggles. The next parameter in the winpdef() function is fconv. These are similar to the command toggles of inputsf() and winputsf() except that the fconv character applies conversion to the whole field. Valid fconv characters are: 0 - apply no conversion 'L' - convert letters to lowercase 'M' - convert letters to mixed upper & lowercase 'P' - password field (do not echo characters) 'U' - convert letters to uppercase '9' - numeric field (right justify, space fill to the left of the decimal; and left justify, zero fill to the right of the decimal. After the fconv parameter comes the mode parameter. This parameter allows you to specify if the input field is going to create new data or update old data. If the mode parameter is 0, then the input field will be used for entering new data. If the mode parameter is nonzero, then the input field will be used to update the old data contained in the str parameter. If you specify 2 for mode, the cursor will appear at the end of the line and if an editing key is pressed first, the field will be used for updating, otherwise the field will be used to create new information. If you do choose to update, then the length of the input str will be adjusted to the field size either by truncation or padding with spaces. The next parameter in the winpdef() function is validate. This parameter is the address of an optional field validation function. On exit of each field, winpread() will call this function to validate it. You can use this function for validating, modifying, displaying error messages, or just about anything. This must function accept a pointer to char for input and return either 0 for no error, or the position in the field where the error occurred (starting with 1). If no validation function is to be used, then specify NULL. Here's an example field validation function that checks for embedded spaces: int check_field_for_embedded_spaces(char *input_field) { int current_position=1,error_position=0; /* search for end of text */ while(*input_field++!=' ') current_position++; /* search to end of field for non-space characters */ while(*input_field==' ') { 110 current_position++; input_field++; } /* if at not end of field, then field is invalid */ if(*input_field!='\0') error_position=current_position; return(error_position); } The final parameter to winpdef(), help, is the help category number to assign to this menu item. This is useful if you are using the context-sensitive help system and you want to assign a different help category to each field. If you do not need to use this feature, specify 0 for this parameter. The winpdef() function will return one of the following values: W_NOERROR - no error W_NOACTIVE - no active window W_INVCOORD - invalid coordinates W_ALLOCERR - memory allocation error W_NOFRMBEG - no begin of form specified (winpbeg() not called) W_INVFORMT - invalid format string (syntax error) Once you have defined all input fields with winpdef(), you call winpread() to process them. The user is allowed to move around and edit all of the fields. The input fields are validated on the fly and after entering the last field. Valid editing keys are listed in Appendix E. After the winpread() function returns, all fields defined with winpdef() will be cleared. The receiving strings of all defined fields will now contain the data entered. If Escape checking was on and [Esc] was pressed, then all receiving strings will contain the values they held before winpread() was called and W_ESCPRESS will be returned. The general structure for defining input fields looks like: winpbeg(...); winpdef(...); winpdef(...); winpdef(...); winpread(); Sometimes, you may have a need to extend or modify the data entry keys used by winpread() during processing of the fields. There is a function, winpkey(), that enables this. What winpkey() does is defines a function to be used as the alternate get-key function so that during winpread() processing you can get a key, test it, change it, or do whatever else you like with it before you return it to winpread(). It also lets you to specify a variable to receive the key that caused termination of the form. The call to winpkey() can be contained anywhere between winpbeg() and winpread(). Often, when dealing with database records, users would like to have [PgUp] mean previous record and [PgDn] mean next record. Let's also say 111 that we want to use [F10] as the normal exit key instead of the currently defined [Ctrl-Enter]. Here is an example of an alternate get-key function would handle this: unsigned get_key(int *done) { unsigned int key; key=getxch(); /* if key was [F10], change it to [Ctrl-Enter] */ if(key=0x4400) key=0x1c0a; /* if key was [PgUp] or [PgDn], set done flag on */ if(key==0x4900 || key==0x5100) *done=TRUE; return(key); } In your code, where you define your form, you use winpkey() to tell CXL of the alternate get-key function's existance and specify which variable to hold the keypress of the termination key. Here's something how it would look in your program: unsigned key_that_terminated_form; /*...define window, begin of form, and all fields...*/ winpkey(get_key,&key_that_terminated_form); winpread(); switch(key_that_terminated_form) { case 0x4900: /* [PgUp] */ case 0x5100: /* [PgDn] */ case 0x1c0d: case 0x1c0a: /* [Enter] or [Ctrl-Enter] (aka [F10]) */ case 0x011b: /* [Esc] */ } ------------------------------------------------------------------------ NAME winpbeg DESCRIPTION Marks the beginning of a data input form, and specifies text attributes to be used by the form. SYNOPSIS #include "cxlwin.h" int winpbeg(int fieldattr,int textattr); INPUTS fieldattr - field attribute textattr - text attribute 112 RETURN VALUE W_NOERROR - no error W_ALLOCERR - memory allocation error W_NOACTIVE - no active window ALSO SEE winpdef winpread ------------------------------------------------------------------------ NAME winpdef DESCRIPTION Defines a window input field. SYNOPSIS #include "cxlwin.h" int winpdef(int wrow,int wcol,char *str,char *format,int fconv, int mode,int (*validate) (char *),int help); INPUTS wrow - start of input, window's row coordinate wcol - start of input, window's column coordinate str - address of string buffer to receive input format - address of field format string. See Appendix D for valid format string characters. fconv - input field conversion character. Applies conversion to all characters in the input field. Can be one of the following: 0 - apply no conversion 'L' - convert letters to lowercase 'M' - convert letters to mixed case 'P' - password field (no echo) 'U' - convert letters to uppercase '9' - numeric field mode - field mode 0 - initial data entry 1 - update existing data 2 - conditional update validate - address of your user validation/modification function. If you do not wish to have a field validation function, then specify NULL. help - help category number to be associated with this input field. Specify 0 if no help category is to be assigned. RETURN VALUE W_NOERROR - no error W_ALLOCERR - memory allocation error W_NOFRMBEG - no begin of form specified, see winpbeg() W_INVCOORD - invalid coordinates W_INVFORMT - invalid format string ALSO SEE 113 winpbeg winpread ------------------------------------------------------------------------ NAME winpfba DESCRIPTION Assigns "before" and "after" function pointers to the input field just defined. The call to this function must appear immediately after the call to the winpdef() to which it relates. During user input, when the user enters the field, the before function gets called. When the user leaves the validated field, the after function gets called. This powerful feature allows you to do some pretty advanced stuff with input fields, but must be used very carefully. SYNOPSIS #include "cxlwin.h" int winpfba(void (*before)(void),void (*after)(void)); INPUTS before - address of the before function. If you do not wish to define a before function, specify NULL. after - address of the after function. If you do not wish to define an after function, specify NULL. RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_NOFRMBEG - no begin of form defined. See winpbeg(). W_NOINPDEF - no input fields defined. See winpdef(). ALSO SEE winpbeg winpdef winpread ------------------------------------------------------------------------ NAME winpfcurr DESCRIPTION Returns the address of the current input field's record. After the call to this function, you may access any of the current input field's elements. See the definition of struct _field_t in the CXLWIN.H file for all of the elements you may use. Use caution when updating elements in the field's record. This function should only be called while the input form to which it relates is being processed. SYNOPSIS #include "cxlwin.h" struct _field_t *winpfcurr(void); 114 RETURN VALUE The address of the current input field's record. You can access individual elements of the field's record by using this address and the C pointer operator "->". This function is a macro with no error checking, and will most likely return an invalid value if there isn't an active form. ALSO SEE winpbeg winpdef winpffind winpread EXAMPLE printf("Length of current input field is: %d\n" ,winpfcurr()->lenfld); ------------------------------------------------------------------------ NAME winpffind DESCRIPTION Searches for a defined field whose window coordinates match the input coordinates, then returns the address of the field's record. After the call to this function, you may access any of the found input field's elements. See the definition of struct _field_t in the CXLWIN.H file for all of the elements you may use. Use caution when updating elements in the field's record. This function should only be called during the processing of the input form to which it relates. SYNOPSIS #include "cxlwin.h" struct _field_t *winpffind(int wrow,int wcol); INPUTS wrow - window row of field to search for wcol - window column of field to search for RETURN VALUE The address of the found field's record. You can access individual elements of the field's record by using this address and the C pointer operator "->". If an error occurred, then NULL will be returned and _winfo.errno will be set to one of the following values: W_NOACTIVE - no active window W_NOFRMDEF - no form defined. See winpbeg(). W_NOTFOUND - no defined field matches input window coordinates ALSO SEE winpbeg winpdef winpfcurr winpread ------------------------------------------------------------------------ NAME winpkey 115 DESCRIPTION Allows you to extend or modify the data entry keys used as the alternate get-key function so that during winpread() processing you can get a key, test it, change it, or do whatever else you like with it before you return it to winpread(). It also lets you specify a variable to receive the key that caused termination of the form. The call to winpkey() can be contained anywhere between winpbeg() and winpread(). SYNOPSIS #include "cxlwin.h" int winpkey(unsigned (*getkey)(int *),unsigned *termkey); INPUTS getkey - address of the function to be used as the alternate get-key function. termkey - address of the unsigned integer which will receive the keycode of the key that will terminate the form. RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active form W_NOFRMBEG - no begin of form specified. See winpbeg(). ALSO SEE winpread ------------------------------------------------------------------------ NAME winpread DESCRIPTION Marks the end of the defined input form and initiates processing of the defined input fields. The user is allowed to edit back and forth between the defined fields until the last field is entered. Valid editing keys are listed in Appendix E. SYNOPSIS #include "cxlwin.h" int winpread(void); RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_ESCPRESS - [Esc] key was pressed (only if Escape checking was on) W_NOINPDEF - no input fields defined ALSO SEE winpdef winpkey wsetesc ------------------------------------------------------------------------ NAME 116 winputsf DESCRIPTION Inputs a formatted string from the keyboard. Typed-in characters will be echoed to the active window in the current text attribute. This function provides an extremely powerful method of accept single-line input from the user. You can limit input characters to certain characters of a type, such as numbers, insert strings in between typed in characters, create custom prompts, disable [Enter] until the field is filled, and more. Provides Escape checking. Updates cursor position. SYNOPSIS #include "cxlwin.h" int winputsf(char *str,char *fmt); INPUTS str - address of the allocated space to receive string fmt - address of the format string. See Appendix D for valid format string characters. RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_ESCPRESS - [Esc] key was pressed W_INVFORMT - invalid format string ALSO SEE wgetns wgets wscanf wsetesc wtextattr EXAMPLE char buf[10]; if(winputsf(buf,"'Enter phone nr: '!R--!'('!+!###!-!') '!+!###" "!-!'-'!+!####")) wprintf("Error: %s\n",werrmsg()); ------------------------------------------------------------------------ NAME winsline DESCRIPTION Inserts a blank line in the active window. Depending upon the input scroll direction, lines will shift up or down to make room for the new line. SYNOPSIS #include "cxlwin.h" int winsline(int wrow,int direc); INPUTS wrow - window row to insert at direc - scroll direction: D_UP - scroll up D_DOWN - scroll down 117 RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_INVCOORD - invalid window row ALSO SEE wdelline wscroll ------------------------------------------------------------------------ NAME wintodisk DESCRIPTION Copies a window of the screen to a disk file. SYNOPSIS #include "cxlvid.h" int wintodisk(int srow,int scol,int erow,int ecol,char *fname); INPUTS srow - start row of window scol - start column of window erow - end row of window ecol - end column of window fname - address of the string containing the filename of the file to write to RETURN VALUE Nonzero if an error occurred. ALSO SEE disktoscrn disktowin scrntodisk EXAMPLE wintodisk(10,10,20,40,"WINDOW.SAV"); ------------------------------------------------------------------------ NAME wisactiv DESCRIPTION Determines if the specified window is active. SYNOPSIS #include "cxlwin.h" int wisactiv(WINDOW whandle); INPUTS whandle - the window handle of the window to check. RETURN VALUE Nonzero if specified window is active. 118 ALSO SEE wactiv whandle ------------------------------------------------------------------------ Bar Menu Functions To use CXL's menuing system, you must be familiar with the process of defining menus. There are several functions associated with the defining of menus. These functions must appear in your source code in a certain order. Menu structures can be defined as simple as a one-level pop-up menu, or as complex as a multi-level pull-down menu system. The basic format of all menu structures is: wmenuitem [wmenuitxt] [wmenuiba] [...] [wmenuitem...] wmenuend wmenuget Either wmenubeg() or wmenubegc() is required to mark the start of a menu, wmenuitem() is required to define menu items, wmenuend() is required to mark the end of a menu, and wmenuget() initiates user processing of the entire menu structure. Notice that you can also define entire menus underneath any individual menu item. This allows you to easily create nested menus to aid in building complex pull-down and multi-layered menuing systems. There is no limit to how deep you can nest sub-menus, with the exception of available memory. When coding multi-level menu systems, it is a good idea to use indenting as shown above to help you distinguish which menu items and menu-ends go with which menu-begins. wmenuitxt() and wmenuiba() are optional functions. They allow you to add specific features to a menu item. If either of these 2 functions are used, they must immediately follow the call to wmenuitem() to which they pertain. After you define the menu structure and call wmenuget(), the user is allowed to make a selection. The following editing keys may be used by the user when processing the menu: LeftArrow - moves selection bar to item left. RightArrow - moves selection bar to item right. UpArrow - moves selection bar to item upwards. DownArrow - moves selection bar to item downwards. If the current menu item has a pull-down menu attached, then it will be opened for processing. Enter - selects the item that the selection bar is on. If 119 selected item has a sub-menu attached, then processing of that menu will begin. Home - moves selection bar to upper-leftmost item. End - moves selection bar to lower-rightmost item. Esc - if Escape checking is on, and your are in the root menu, pressing this cancels input and returns a -1. If inside a sub-menu, then you will just back up to the previous menu. You can also quick-select a menu item by pressing its highlighted selection character, unless this feature is disabled. CXL's menuing system also includes built-in mouse support. If you want to use it, you need to call msinit() somewhere near the beginning of the program. This will set the mouse support level to MS_KEYS, which allows the mouse to emulate cursor keys. If you would like a point-and-shoot selection capability where the user moves the mouse cursor around then presses the button to select, you must set the mouse support level to MS_CURS or MS_FULL via mssupport(). In either method of mouse support, the left mouse button is equivalent to the [Enter] key, and the right mouse button is equivalent to the [Esc] key. Each menu item can have a function and/or sub-menu attached to it. When the user selects the menu item, wmenuget() will first check for an attached sub-menu. If one exists, it will be processed. Then wmenuget() will check for a defined select function. If one exists, then wmenuget() will call it. This gives you two ways to handle a user selection. The first, as you've seen, is to have a function attached to the menu item. For example, if the menu item is "(A)dd Record" and it has a select function called add_record(), then it will be called upon selecting that menu item. The other way to handle a user selection is by using a switch/case to test the return value from wmenuget(). This will only work properly on single-level menus, but sometimes gives you more flexibility. ------------------------------------------------------------------------ NAME wmenubeg DESCRIPTION Starts a menu/sub-menu definition and describes the window which the menu will reside in. This does not actually open any windows or menus, just defines them. This must be used in conjuction with wmenuitem() and wmenuend(). This is one of the 4 functions that are required to process a menu. SYNOPSIS #include "cxlwin.h" int wmenubeg(int srow,int scol,int erow,int ecol,int btype, int battr,int wattr,void (*open)(void)); 120 INPUTS srow - screen start row of where menu's window will open scol - screen start column of where menu's window will open erow - screen end row of where menu's window will open ecol - screen end column of where menu's window will open btype - border type. Can be one of the following: 0 - single line 1 - double line 2 - single horizontal, double vertical line 3 - double horizontal, single vertical line 4 - thick line 5 - no border battr - attribute to be used for the menu window's border. If btype==5, then this value will be ignored. wattr - attribute to be used for the menu's window. open - address of the function to call upon opening of the menu's window. If you want to add a title, shadow, etc. to the menu's window after it opens, this lets you specify which function to call to perform these tasks. Specify NULL if you don't want to use this feature. RETURN VALUE W_NOERROR - no error W_NOITMDEF - no menu items defined W_ALLOCERR - memory allocation error ALSO SEE wmenubegc wmenuitem wmenuend wmenuget EXAMPLE wmenubeg(2,10,9,18,0,YELLOW,_BLUE,NULL); ------------------------------------------------------------------------ NAME wmenubegc DESCRIPTION Starts a menu/sub-menu definition. This is used in place of wmenubeg(). This function differs from wmenubeg() in that when the user processes the defined menu, the menu will assume whatever the active window is at the time. SYNOPSIS #include "cxlwin.h" int wmenubegc(void); RETURN VALUE W_NOERROR - no error W_NOITMDEF - no menu items defined W_ALLOCERR - memory allocation error ALSO SEE wmenubeg wmenuitem wmenuend wmenuget 121 ------------------------------------------------------------------------ NAME wmenuend DESCRIPTION Ends a menu/sub-menu definition and defines specific features/attributes of that menu. This is one of the 4 functions that are required to process a menu. SYNOPSIS #include "cxlwin.h" int wmenuend(int taginit,int menutype,int barwidth,int textpos, int textattr,int scharattr,int noselattr,int barattr); INPUTS taginit - tag ID of the item that the selection bar will start at. menutype - a mask which describes how the menu will act. Two or more menutypes can be combined using the bitwise OR operator '|'. For example, if the menu you are defining is to be a pull-down menu, and you want to disable quick selection, then you would specify M_PD|M_NOQS. Valid menutypes are: M_HORZ - horizontal menu M_VERT - vertical menu M_OMNI - omnidirectional menu M_PD - pull-down menu M_SAVE - save last bar position M_NOQS - disable quick selection barwidth - width of the selection bar. If zero is given, then the selection bar will conform to the width of each menu item. If a number greater than the width of the window is given, then the barwidth will be adjusted to its width. textpos - offset position from the start of the selection bar that the menu item text will start. If barwidth==0, then textpos is ignored. textattr - attribute to be used for menu text scharattr - attribute to be used for the quick selection character noselattr - attribute to be used for nonselectable text barattr - attribute to be used for the selection bar RETURN VALUE W_NOERROR - no error W_NOITMDEF - no menu items defined W_INVTAGID - taginit was invalid. It must match one of the tagids in the current menu. ALSO SEE wmenubeg wmenubegc wmenuget wmenuitem EXAMPLE wmenuend('F',M_VERT,20,2,YELLOW|_BLUE,LCYAN|_BLUE,LGREY|_BLUE ,BLUE|_LGREY); 122 ------------------------------------------------------------------------ NAME wmenuget DESCRIPTION Processes the defined menu structure. The user is allowed to move a selection bar around to the various menu items. If mouse support is on, then the user can use the mouse for selecting as well. If sub-menus exists, then the user can select those also. Escape checking is provided for when the user is in the root menu, however if the user is in a sub-menu, pressing [Esc] will always return to the next level up. This is one of the 4 functions that are required to process a menu. SYNOPSIS #include "cxlwin.h" int wmenuget(void); RETURN VALUE The tag ID of the menu item that was selected in the root menu. If an error occurred, then -1 will be returned and the global variable _winfo.errno will be set to one of the following: W_NOMNUDEF - no menu defined W_NOMNUEND - no end of menu specified. See wmenuend(). W_ESCPRESS - the [Esc] key was pressed from the root menu W_ALLOCERR - memory allocation error W_INVCOORD - invalid coordinates W_INVBTYPE - invalid box type ALSO SEE wmenubeg wmenubegc wmenuend wmenuitem wsetesc ------------------------------------------------------------------------ NAME wmenuiba DESCRIPTION Assigns "before" and "after" function pointers to the menu item just defined. The call to this function must appear immediately after the call to the wmenuitem() to which it relates. During the processing of the menu, when the user moves to the item, the before function gets called. When the user leaves the item, the after function gets called. This powerful feature allows you to do some advanced stuff with menus, but must be used very carefully. One possible use of wmenuiba() is to define a before function that opens a window and writes some text in it, and an after function which closes that window. When the user moved to that menu item, the window would open up and display text, then when the user left that menu item, the window would automatically close. SYNOPSIS #include "cxlwin.h" 123 int wmenuiba(void (*before)(void),void (*after)(void)); INPUTS before - address of the before function. If you do not wish to define a before function, specify NULL. after - address of the after function. If you do not wish to define an after function, specify NULL. RETURN VALUE W_NOERROR - no error W_NOITMDEF - no menu items defined. See wmenuitem(). ALSO SEE wmenubeg wmenuend wmenuget wmenuitem wmenuitxt ------------------------------------------------------------------------ NAME wmenuicurr DESCRIPTION Returns the address of the current menu item's record. After this call, you may access any of the item's elements. This function would most likely be called from a "select", "before", or "after" function. See the struct _item_t definition in the CXLWIN.H file for all the elements you may use. SYNOPSIS #include "cxlwin.h" struct _item_t *wmenuicurr(void); RETURN VALUE The address of the current menu item's record. ALSO SEE wmenubeg wmenuend wmenuget wmenuifind wmenuitem wmenumcurr EXAMPLE printf("The current menu item's tagid = %d\n",wmenuicurr()->tagid); ------------------------------------------------------------------------ NAME wmenuidsab DESCRIPTION This function disables a menu item by making it nonselectable. This function would most likely be called from a "select", "before", or "after" function. It will set a flag so that when the called function returns to the menu, the disabled menu item will be displayed in the text attribute defined for nonselectable text. SYNOPSIS #include "cxlwin.h" 124 int wmenuidsab(int tagid); INPUTS tagid - the tag ID of the menu item to disable RETURN VALUE W_NOERROR - no error W_NOMNUDEF - no menu defined W_NOTFOUND - tagid not found ALSO SEE wmenuienab wmenuinext ------------------------------------------------------------------------ NAME wmenuienab DESCRIPTION This function enables a menu item by making it selectable. This function would most likely be called from a "select", "before", or "after" function. It will set a flag so that when the called function returns to the menu, the enabled menu item will be displayed in the text attribute defined for selectable text. SYNOPSIS #include "cxlwin.h" int wmenuienab(int tagid); INPUTS tagid - the tag ID of the menu item to enable RETURN VALUE W_NOERROR - no error W_NOMNUDEF - no menu defined W_NOTFOUND - tagid not found ALSO SEE wmenuidsab wmenuinext ------------------------------------------------------------------------ NAME wmenuifind DESCRIPTION Searches the menu tree structure for the record of the menu item matching the input tag identifier, then returns the found record's address. After the call to this function, you may access any of the found menu item's elements. See the definition of struct _item_t in the CXLWIN.H file for all of the elements you may use. Use caution when updating elements in the menu item's record. This function should only be called during the processing of the menu to which it relates. 125 SYNOPSIS #include "cxlwin.h" struct _item_t *wmenuifind(int tagid); INPUTS tagid - the tag identifier of the menu item to find RETURN VALUE The address of the found menu item's record. You can access individual elements of the menu item's record by using this address and the C pointer operator "->". If an error occurred, then NULL will be returned and _winfo.errno will be set to one of the following values: W_NOMNUDEF - no menu is defined. See wmenubeg(). W_NOTFOUND - input tag identifier not found ALSO SEE wmenubeg wmenuend wmenuget wmenuicurr wmenuitem ------------------------------------------------------------------------ NAME wmenuinext DESCRIPTION Defines which menu item the selection bar will move to next. This function would most likely be called from a "select", "before", or "after" function. The selection bar does not actually move until the called function returns to the menu. SYNOPSIS #include "cxlwin.h" int wmenuinext(int tagid); INPUTS tagid - the tag ID of the menu item that you want the selection bar to move to. RETURN VALUE W_NOERROR - no error W_NOMNUDEF - no menu defined W_NOTFOUND - tagid not found ALSO SEE wmenuidsab wmenuienab ------------------------------------------------------------------------ NAME wmenuitem DESCRIPTION Defines a menu item. This is one of the 4 functions that are required to process a menu. 126 SYNOPSIS #include "cxlwin.h" int wmenuitem(int wrow,int wcol,char *str,int schar,int tagid, int fmask,void (*select)(void),unsigned hotkey, int help); INPUTS wrow - window row wcol - window column str - address of menu item string schar - quick selection character. This is often the first letter of the menu item. tagid - unique tag identifier of this particular menu item. This is the value that wmenuget() returns upon its selection. fmask - feature mask. Allows you to define one or more additional features for this menu item. Valid features are: M_HASPD - has a pull-down menu attached M_NOSEL - menu item is not selectable M_CLOSE - close this menu when item is selected. Menu's window is closed after the selection function returns. M_CLOSB - close this menu when item is selected. Menu's window is closed before the selection function is called. M_CLALL - close all menus when item is selected and the selection function returns. More than one feature can be specified by using the C bitwise OR operator '|'. For example, if this item has a pull-down menu attached and it is not selectable, you would specify (M_HASPD|M_NOSEL). Specify 0 if you don't want to define an fmask for this item. select - address of the function to call upon selection of this menu item. Specify NULL if you don't want to define a select function. hotkey - keycode of the key, which when pressed, will select this menu item's function from anywhere within the menu structure. This allows the user to call this menu item's select function even if not currently processing its menu. See Appendix B for a list of keycodes that you can use. Specify 0 if you don't want to define a hotkey. help - help category number to be associated with this item. Specify 0 is you don't want to define a help category for this item. RETURN VALUE W_NOERROR - no error W_NOMNUBEG - no begin of menu specified. See wmenubeg(). W_ALLOCERR - memory allocation error ALSO SEE wmenubeg wmenubegc wmenuend wmenuget wmenuicurr wmenuitxt EXAMPLE wmenuitem(0,0,"Load F3",'L',1,M_CLOSE,load_file,0x3d00,0); 127 ------------------------------------------------------------------------ NAME wmenuitxt DESCRIPTION Adds a text description to a menu item. You can use this function to create Lotus-style menus where the text descriptions are displayed underneath the menu and change each time the user moves to a new menu item. SYNOPSIS #include "cxlwin.h" int wmenuitxt(int wrow,int wcol,int attr,char *str); INPUTS wrow - window row wcol - window column attr - text attribute str - address of description string RETURN VALUE W_NOERROR - no error W_NOITMDEF - no menu items defined ALSO SEE wmenuiba wmenuitem EXAMPLE wmenuitxt(1,0,LCYAN|_BLUE,"Quit program and return to DOS"); ------------------------------------------------------------------------ NAME wmenumcurr DESCRIPTION Returns the address of the currently active menu's record. After this call, you may access any of the menu's elements. See the definition of struct _menu_t in the CXLWIN.H file for all of the elements you may use. Use caution when updating elements in the menu's record. This function should only be called while the menu to which it relates is being processed. SYNOPSIS #include "cxlwin.h" struct _menu_t *wmenumcurr(void); RETURN VALUE The address of the current menu's record. After you get this address, you can access the menu's elements via the C pointer operator "->". There is no error return value - if you call this function while not processing a menu, then you will more than likely get an invalid address. 128 ALSO SEE wmenubeg wmenuend wmenuget wmenuicurr wmenuitem ------------------------------------------------------------------------ NAME wmessage DESCRIPTION Displays text on the top or bottom border of the active window. SYNOPSIS #include "cxlwin.h" int wmessage(char *str,int border,int leftofs,int attr); INPUTS str - address of message string border - window border code. Can be one of the following: TP_BORD - top border BT_BORD - bottom border leftofs - offset from left border to display message at attr - attribute of message text RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_STRLONG - string could not fit in window W_NOBORDER - window has no border ALSO SEE wbprintc wtitle EXAMPLE wmessage("[ F1=Help ]",BT_BORD,2,YELLOW|_BLACK); ------------------------------------------------------------------------ NAME wmove DESCRIPTION Moves the active window to a new location on the screen. SYNOPSIS #include "cxlwin.h" int wmove(int nsrow,int nscol); INPUTS nsrow - new starting row of window nscol - new starting column of window RETURN VALUE W_NOERROR - no error W_ALLOCERR - memory allocation error 129 W_NOACTIVE - no active window ALSO SEE wcopy wdrag wsize wslide ------------------------------------------------------------------------ NAME wopen DESCRIPTION Opens a screen window and makes it active. The cursor location will be initialized to window row 0, column 0. The text attribute will be initialized to the same attribute as the window. You can open as many windows as memory permits. SYNOPSIS #include "cxlwin.h" WINDOW wopen(int srow,int scol,int erow,int ecol,int btype, int battr,int wattr); INPUTS srow - starting row scol - starting column erow - ending row ecol - ending column btype - box type. Can be one of the following: 0 - single line border 1 - double line border 2 - single horz, double vert line border 3 - double horz, single vert line border 4 - thick line border 5 - no border (uses spaces for border chars). A borderless window has a greater effective window area than a window with a border. battr - attribute of window's border. wattr - attribute of window (and initially the text) RETURN VALUE The window handle of the new window or a zero if an error occurred. If error, the global variable _winfo.errno will be set to one of the following: W_ALLOCERR - memory allocation error W_INVCOORD - invalid coordinates W_INVBTYPE - invalid box type ALSO SEE videoinit wactiv wclose wcloseall wfillch EXAMPLE wopen(10,10,20,40,0,LCYAN|_BLUE,LGREEN|_BLUE); ------------------------------------------------------------------------ 130 NAME wperror DESCRIPTION Opens an error window, displays an error message, sounds a beep, waits for a keypress, then returns to caller. The error window is opened in the general vicinity of the cursor position. SYNOPSIS #include "cxlwin.h" int wperror(char *message); INPUTS message - address of the string containing the error message RETURN VALUE W_NOERROR - no error W_ALLOCERR - memory allocation error W_STRLONG - error message string too long ALSO SEE werrmsg EXAMPLE wperror("Field cannot be blank!"); ------------------------------------------------------------------------ NAME wpgotoxy DESCRIPTION Sets cursor coordinates within the active window. If cursor coordinates are out of the window, wpgotoxy() will try to wrap them around to fit in the window. SYNOPSIS #include "cxlwin.h" int wpgotoxy(int wrow,int wcol); INPUTS wrow - window row (Y coordinate) wcol - window column (X coordinate) RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_INVCOORD - invalid coordinates ALSO SEE wgotoxy wreadcur ------------------------------------------------------------------------ 131 NAME wpickfile DESCRIPTION This function will open up a window and display as many file/directory names in it as it can. The user can use a selection bar to move through the file/directory names and select one. If all of the file/directory names cannot fit in the window, scrolling and paging is allowed. If the user selects a directory, wpickfile() will change to that directory and display the list of files/directories in it. After the selection is made, wpickfile() will return the complete path name of the selected file. SYNOPSIS #include "cxlwin.h" char *wpickfile(int srow,int scol,int erow,int ecol,int btype, int bordattr,int winattr,int barattr,int title, char *filespec,void (*open)(void)); INPUTS srow - start row of pick window scol - start column of pick window erow - end row of pick window ecol - end column of pick window. If ecol==-1, then the window's width will conform to that of the longest matching filename. btype - window box type (0-5) bordattr - border attribute winattr - window attribute barattr - selection bar attribute title - display filespec title on upper border? (0=no, 1=yes) filespec - match filespec (ie. "*.*") open - address of the function to call upon each opening of the file pick window. If you do not need to use this feature, specify NULL. RETURN VALUE The address of the static string containing the full drive:path\filename string of the selected file. If an error occurred, NULL will be returned and _winfo.errno will be set to one of the following: W_ESCPRESS - the [Esc] key was pressed W_ALLOCERR - memory allocation error W_DOSERROR - DOS error (ie. invalid directory) W_INVCOORD - invalid window coordinates W_INVBTYPE - invalid box type W_STRLONG - window not wide enough to hold largest file name W_NOMATCH - no files matched input filespec ALSO SEE wpickstr wsetesc EXAMPLE char *fname; 132 fname=wpickfile(10,10,20,65,0,LCYAN|_BLUE,CYAN|_BLUE,BLUE|_LGREY,1 ,"*.*",NULL); printf("You selected: %s\n",fname); ------------------------------------------------------------------------ NAME wpickstr DESCRIPTION This function will open up a window and display as many of the input strings in it as it can. The user can use a selection bar to move through the strings and select one. If all of the strings cannot fit in the window, scrolling and paging is allowed. After the selection is made, wpickstr() will return the array subsript of the string that was selected. SYNOPSIS #include "cxlwin.h" int wpickstr(int srow,int scol,int erow,int ecol,int btype, int bordattr,int winattr,int barattr,char *strarr[], int initelem,void (*open)(void)); INPUTS srow - start row of pick window scol - start column of pick window erow - end row of pick window ecol - end column of pick window. If ecol==-1, then the window's width will conform to that of the longest string in the input array. btype - window box type (0-5) bordattr - border attribute winattr - window attribute barattr - selection bar attribute strarr - address of array of char pointers (strings) to select from. The last pointer in the array MUST be NULL! initelem - element of string to initialize selection bar to. If given element is invalid, it will default to 0. open - address of the function to call upon each opening of the string pick window. If you do not need to use this feature, specify NULL. RETURN VALUE The array subscript of the selected string. If an error occurred, then -1 will be returned and _winfo.errno will be set to one of the following: W_ESCPRESS - the [Esc] key was pressed W_INVCOORD - invalid window coordinates W_INVBTYPE - invalid box type W_STRLONG - window not wide enough to hold largest file name ALSO SEE wpickfile wselstr wsetesc 133 EXAMPLE int i; char *days[]= { "Sunday","Monday","Tuesday","Wednesday","Thursday", "Friday","Saturday",NULL }; i=wpickstr(10,10,14,-1,0,YELLOW,LCYAN|_BLUE,BLUE|_LGREY,days,0, NULL); if(i!=-1) printf("You selected %s\n",days[i]); ------------------------------------------------------------------------ NAME wprintc DESCRIPTION Displays a character in the active window. Control characters are not recognized. Cursor position is not updated. SYNOPSIS #include "cxlwin.h" int wprintc(int row,int col,int attr,int ch); INPUTS row - window row to display character at col - window column to display character at attr - text attribute for character ch - character RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_INVCOORD - invalid coordinates ALSO SEE wbprintc wprints wputc EXAMPLE wprintc(5,5,BLINK|LRED|_GREEN,'X'); ------------------------------------------------------------------------ NAME wprintf DESCRIPTION Displays a formatted string to the active window at the current cursor position. Works like the standard printf() function does. Recognizes control characters. Characters will be displayed in the attribute set by the wtextattr() function. Updates cursor position. Also recognizes CXL Escape sequences. See Appendix C for a list of valid Escape codes. SYNOPSIS #include "cxlwin.h" int wprintf(const char *format,...); 134 INPUTS format - address of the format string. Refer to the your compiler's run-time library reference manual for information on valid format characters. ... - any additional arguments RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window ALSO SEE wputc wputns wputs wtabwidth wtextattr EXAMPLE int i=32767; double d=3.14159; char ch='X',*str="Hello, world"; wprintf("i = %d, d = %f, ch = %c, str = %s\n",i,d,ch,str); ------------------------------------------------------------------------ NAME wprints DESCRIPTION Displays a string in the active window. Control characters are not recognized. Cursor position is not updated. SYNOPSIS #include "cxlwin.h" int wprints(int wrow,int wcol,int attr,char *str); INPUTS wrow - window row to display string at wcol - window column to display string at attr - text attribute for displayed characters str - address of string RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_INVCOORD - invalid coordinates W_STRLONG - string too long to fit on window line ALSO SEE wcenters wprintsf wputs wrjusts wwprints EXAMPLE wprints(10,15,BLINK|YELLOW|_BROWN,"Hello, world"); ------------------------------------------------------------------------ NAME wprintsf 135 DESCRIPTION Displays a string to active window using a CXL format string. If a character in a string doesn't match its format control character, it will be displayed as a '?'. Control characters are not recognized. Cursor position is not updated. SYNOPSIS #include "cxlwin.h" int wprintsf(int wrow,int wcol,int attr,char *format,char *str); INPUTS wrow - window row wcol - window column attr - text attribute format - address of format string. Valid format string characters are listed in Appendix D. str - address of the string to display. RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_INVFORMT - invalid format string W_STRLONG - there were more characters in the display string than the format string would display. ALSO SEE wprints EXAMPLE char str1[]="5125900460",str2[]="(512) 590-2910"; wprintsf(3,5,LGREEN|_GREEN,"'('###') '###'-'####",str1); wprintsf(4,5,LGREEN|_GREEN,"##############",str2); ------------------------------------------------------------------------ NAME wputc DESCRIPTION Displays a character in the active window at current cursor position using current text attribute. Recognizes control characters. Updates cursor position. SYNOPSIS #include "cxlwin.h" int wputc(int ch); INPUTS ch - the character to be displayed RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window 136 ALSO SEE wdupc wprintc wprintf wtabwidth wtextattr ------------------------------------------------------------------------ NAME wputns DESCRIPTION Displays a string in the active window at the current cursor location using current text attribute. The input width will determine how many characters are actually displayed. Padding with spaces or truncating of output will be used where neccessary. Recognizes control characters. Updates cursor position. SYNOPSIS #include "cxlwin.h" int wputns(char *str,int width); INPUTS str - address of the string to print width - width to display output string at RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window ALSO SEE wprintf wputs wtextattr EXAMPLE wputns("Hello, world",5); ------------------------------------------------------------------------ NAME wputs DESCRIPTION Displays a string in the active window at the current cursor position using current text attribute. Recognizes control characters. Updates cursor position. Also recognizes CXL Escape sequences. See Appendix C for a list of valid Escape codes. SYNOPSIS #include "cxlwin.h" int wputs(char *str); INPUTS str - the address of the string to display RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window 137 ALSO SEE wprintf wprints wputns wputsw wtabwidth wtextattr EXAMPLE wputs("\t\033LHello, \033Lworld!\n\n"); ------------------------------------------------------------------------ NAME wputsw DESCRIPTION Displays a string in active window at the current cursor position. Words will be wrapped around to the next line if necessary. Characters are displayed in the window's current text attribute. Recognizes control characters. Updates cursor position. Also recognizes CXL Escape sequences. See Appendix C for a list of valid Escape codes. SYNOPSIS #include "cxlwin.h" int wputsw(char *str); INPUTS str - the address of the string to display RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window ALSO SEE wprintf wputs wtextattr EXAMPLE wputsw("This is a very long string that will be wrapped around to " "the next line."); ------------------------------------------------------------------------ NAME wreadcur DESCRIPTION Reads the current cursor coordinates of the active window. SYNOPSIS #include "cxlwin.h" int wreadcur(int *wrow,int *wcol); INPUTS wrow - address of integer to receive current window row wcol - address of integer to receive current window column RETURN VALUE 138 W_NOERROR - no error W_NOACTIVE - no active window ALSO SEE wgotoxy EXAMPLE int wrow,wcol; wreadcur(&wrow,&wcol); ------------------------------------------------------------------------ NAME wrestore DESCRIPTION Restores a previously saved region of the screen screen and frees the memory allocated by wsave(). SYNOPSIS #include "cxlwin.h" void wrestore(int *wbuf); INPUTS wbuf - address of previously wsave()d window. ALSO SEE srestore wsave ------------------------------------------------------------------------ NAME wrjusts DESCRIPTION Displays a string right justified to specified column in the active window. Does not recognize control characters. Does not update cursor position. SYNOPSIS #include "cxlwin.h" int wrjusts(int wrow,int wjcol,int attr,char *str); INPUTS wrow - window row to display string at wjcol - window column that string will right justify to attr - text attribute for displayed characters str - address of string to display RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_INVCOORD - invalid coordinates W_STRLONG - string too long to fit in window at specified right 139 justification column. ALSO SEE wcenters wprints ------------------------------------------------------------------------ NAME wsave DESCRIPTION Saves a region of the screen. SYNOPSIS #include "cxlwin.h" int *wsave(int srow,int scol,int erow,int ecol); INPUTS srow - start row scol - start column erow - end row ecol - end column RETURN VALUE Address of newly created window buffer or NULL if a memory allocation error occurred. ALSO SEE ssave videoinit wintodisk wrestore EXAMPLE int *wbuf; if((wbuf=wsave(10,10,20,40))==NULL) printf("Memory allocation error\n"); ------------------------------------------------------------------------ NAME wscanf DESCRIPTION Inputs a formatted string from keyboard. Entered characters will echo to the active window in the attribute set by the wtextattr() function. Cursor position will be updated. Works like the standard C library function scanf() does. This function is only supported by the Turbo C version of CXL. SYNOPSIS #include "cxlwin.h" int wscanf(const char *format,...); INPUTS format - format string. Refer to the section on scanf() in Turbo C's run-time library reference manual. 140 ... - any additional arguments RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window ALSO SEE wgetc wgetns wgets winputsf wtextattr ------------------------------------------------------------------------ NAME wscroll DESCRIPTION Scrolls text lines within the active window, up or down. SYNOPSIS #include "cxlwin.h" int wscroll(int count,int direc); INPUTS count - number of lines to scroll direc - scroll direction: D_UP - scroll up D_DOWN - scroll down RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window ALSO SEE wdelline winsline wscrollbox ------------------------------------------------------------------------ NAME wscrollbox DESCRIPTION Scrolls a region of the active window up or down. SYNOPSIS #include "cxlwin.h" int wscrollbox(int wsrow,int wscol,int werow,int wecol,int count, int direc); INPUTS wsrow - window start row wscol - window start column werow - window end row wecol - window end column count - number of lines to scroll direc - direction of scroll: 141 D_UP - scroll up D_DOWN - scroll down RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_INVCOORD - invalid coordinates ALSO SEE wdelline winsline wscroll ------------------------------------------------------------------------ NAME wselstr DESCRIPTION Allows user to select one string from an array of strings via an in-place "menu". Provides Escape checking. SYNOPSIS #include "cxlwin.h" int wselstr(int wrow,int wcol,int attr,char *strarr[],int initelem); INPUTS wrow - window row to display selections at wcol - window column to display selections at attr - attribute for selection text strarr - the array of string (char *) pointers which to pick from. The last pointer in the array MUST be NULL! initelem - element of string to initialize selection bar to. If given element is invalid, it will default to 0. RETURN VALUE The array subscript of the string which was selected. If an error occurred, then -1 will be returned and _winfo.errno will be set to one of the following: W_NOACTIVE - no active window W_ESCPRESS - [Esc] key was pressed (if Escape checking was on) ALSO SEE wpickstr wsetesc EXAMPLE int i; char *prn_ports[]= { "PRN","LPT1","LPT2","COM1","COM2",NULL }; wprints(0,0,LCYAN|_BLUE,"Select printer:"); i=wselstr(0,16,LMAGENTA|_BLUE,prn_ports,0); if(i!=-1) wprintf("You selected %s\n",prn_ports[i]); ------------------------------------------------------------------------ NAME wsetesc 142 DESCRIPTION Sets the Escape checking status for window keyboard input functions that utilize Escape checking. By default, Escape checking is on. When the user presses [Esc] while Escape checking is off, the keypress will be ignored. The exception to this is when inside a context-sensitive help screen or when inside a sub-menu of a multi-level menu system. SYNOPSIS #include "cxlwin.h" void wsetesc(int option); INPUTS option - 0 = turn Escape checking off, 1 = turn Escape checking on ALSO SEE wgetchf wgetns winpread winputsf wmenuget wpickfile wpickstr ------------------------------------------------------------------------ NAME wshadoff DESCRIPTION Removes the shadow from the active window, if one exists. This function is only needed when you want to prematurely remove the active window's shadow. The wclose() function automatically calls wshadoff() when it closes a window. SYNOPSIS #include "cxlwin.h" int wshadoff(void); RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window ALSO SEE wclose wshadow ------------------------------------------------------------------------ NAME wshadow DESCRIPTION Gives the active window a shadow. The shadow will be cast to the right of the window and will be translucent (the characters underneath the shadow will show through in the given attribute). SYNOPSIS #include "cxlwin.h" int wshadow(int attr); 143 INPUTS attr - attribute to use for the shadow and the characters underneath it. The most realistic looking shadow will be achieved using DGREY|_BLACK, but depending upon the contrast setting on your monitor, underlying characters may not be visible. Several commercial programs use a shadow attribute of LGREY|_BLACK for this reason. RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_ALLOCERR - memory allocation error ALSO SEE wshadoff EXAMPLE wshadow(DGREY|_BLACK); ------------------------------------------------------------------------ NAME wsize DESCRIPTION Adjusts the size of the active window by changing the screen coordinates of its lower-right corner. SYNOPSIS #include "cxlwin.h" int wsize(int nerow,int necol); INPUTS nerow - new end row of window necol - new end column of window RETURN VALUE W_NOERROR - no error W_ALLOCERR - memory allocation error W_NOACTIVE - no active window W_INVCOORD - invalid coordinates ALSO SEE wcopy wmove ------------------------------------------------------------------------ NAME wslide DESCRIPTION Smoothly slides active window to new screen position. SYNOPSIS 144 #include "cxlwin.h" int wslide(int nsrow,int nscol); INPUTS nsrow - new start row for window nscol - new start column for window RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_INVCOORD - invalid coordinates W_ALLOCERR - memory allocation error ALSO SEE wdrag wmove ------------------------------------------------------------------------ NAME wtabwidth DESCRIPTION Modifies the tab width to be used when displaying tabs in the active window via the window TTY output functions. The default tab width is 8. SYNOPSIS #include "cxlwin.h" void wtabwidth(int tabwidth); INPUTS tabwidth - the new tab width EXAMPLE wputs("\n\tHello, world"); wtabwidth(4); wputs("\n\tHello, world"); ------------------------------------------------------------------------ NAME wtextattr DESCRIPTION Sets the current text attribute for the active window. The current text attribute is used by the window TTY output functions for displaying text inside the active window. SYNOPSIS #include "cxlwin.h" int wtextattr(int attr); INPUTS attr - the new text attribute 145 RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window ALSO SEE attrib wchgattr EXAMPLE wtextattr(LCYAN|_GREEN|BLINK); wputs("Hello, world\n"); ------------------------------------------------------------------------ NAME wtitle DESCRIPTION Gives active window a title and displays title on top border line of window. If active window has no border, then the window's record will be updated, but no title will be visible. SYNOPSIS #include "cxlwin.h" int wtitle(char *str,int tpos,int tattr); INPUTS str - address of title string or NULL to delete title tpos - title position. If str==NULL then tpos is ignored. Valid tpos values are: TLEFT - left justified TCENTER - centered TRIGHT - right justified tattr - attribute of window's title RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_ALLOCERR - memory allocation error ALSO SEE wmessage EXAMPLE wtitle("[ My Window ]",TCENTER,YELLOW|_BROWN); ------------------------------------------------------------------------ NAME wunhide DESCRIPTION Unhides a previously hidden window. The unhidden window becomes the active window. 146 SYNOPSIS #include "cxlwin.h" int wunhide(WINDOW whandle); INPUTS whandle - the handle of the window to unhide. If you want to unhide the most recently hidden window, then specify 0. RETURN VALUE W_NOERROR - no error W_ALLOCERR - memory allocation error W_NOTFOUND - window handle not found W_NOHIDDEN - no hidden windows W_NOTHIDD - window not hidden ALSO SEE whide ------------------------------------------------------------------------ NAME wunlink DESCRIPTION Releases all memory allocated by a window, then unlinks it from the window chain, making it no longer accessible. The screen is not changed in any way. SYNOPSIS #include "cxlwin.h" int wunlink(WINDOW w); INPUTS w - handle of the window to unlink RETURN VALUE W_NOERROR - no error W_NOTFOUND - input window handle was not found ALSO SEE wclose ------------------------------------------------------------------------ NAME wvline DESCRIPTION "Draws" a vertical text line in the active window using characters defined by the given box type. If the vertical line crosses a horizontal line of the same box type, an appropriate intersection or corner will be displayed. SYNOPSIS 147 #include "cxlwin.h" int wvline(int wsrow,int wscol,int count,int btype,int attr); INPUTS wsrow - window start row wscol - window start column count - number of line characters to display btype - box type. Can be one of the following: 0 - single line 1 - double line 2 - single horz, double vert line 3 - double horz, single vert line 4 - thick line 5 - uses spaces for line characters attr - attribute to use for text line RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_INVCOORD - entire text line could not fit in window W_INVBTYPE - invalid box type ALSO SEE whline ------------------------------------------------------------------------ NAME wwprints DESCRIPTION Prints a string to the specified window. The specified window can be active, hidden, or blocked. Control characters are not recognized. Cursor position is not updated. SYNOPSIS #include "cxlwin.h" int wwprints(WINDOW whandle,int wrow,int wcol,int attr,char *str); INPUTS whandle - handle of window to display to wrow - window row to write string to wcol - window column to write string to attr - text attribute for written characters str - address of string to display RETURN VALUE W_NOERROR - no error W_NOACTIVE - no active window W_NOTFOUND - window handle not found W_INVCOORD - invalid window coordinates W_STRLONG - string too long (not all of string was displayed) ALSO SEE 148 wprints 149 Appendix A - Text Attribute Identifiers Foreground Colors Background Colors Identifier Color Identifier Color ---------- ----- ---------- ----- BLACK - black _BLACK - black BLUE - blue _BLUE - blue GREEN - green _GREEN - green CYAN - cyan _CYAN - cyan RED - red _RED - red MAGENTA - magenta _MAGENTA - magenta BROWN - brown _BROWN - brown LGREY - light grey _LGREY - light grey DGREY - dark grey LBLUE - light blue LGREEN - light green LCYAN - light cyan LRED - light red LMAGENTA - light magenta YELLOW - yellow WHITE - white BLINK - blinking foreground Example Usage: BLINK|WHITE|_RED - blinking white on red YELLOW|_BLUE - yellow on blue LMAGENTA - light magenta on black _BLUE - black on blue 150 Appendix B - Keycode Table Key Norm Shift Ctrl Alt ---- ---- ----- ---- --- A 1E61 1E41 1E01 1E00 B 3062 3042 3002 3000 C 2E63 2E42 2E03 2E00 D 2064 2044 2004 2000 E 1265 1245 1205 1200 F 2166 2146 2106 2100 G 2267 2247 2207 2200 H 2368 2348 2308 2300 I 1769 1749 1709 1700 J 246A 244A 240A 2400 K 256B 254B 250B 2500 L 266C 264C 260C 2600 M 326D 324D 320D 3200 N 316E 314E 310E 3100 O 186F 184F 180F 1800 P 1970 1950 1910 1900 Q 1071 1051 1011 1000 R 1372 1352 1312 1300 S 1F73 1F53 1F13 1F00 T 1474 1454 1414 1400 U 1675 1655 1615 1600 V 2F76 2F56 2F16 2F00 W 1177 1157 1117 1100 X 2D78 2D58 2D18 2D00 Y 1579 1559 1519 1500 Z 2C7A 2C5A 2C1A 2C00 1 0231 0221 N/A 7800 2 0332 0340 0300 7900 3 0433 0423 N/A 7A00 4 0534 0524 N/A 7B00 5 0635 0625 N/A 7C00 6 0736 075E 071E 7D00 7 0837 0826 N/A 7E00 8 0938 092A N/A 7F00 9 0A39 0A28 N/A 8000 0 0B30 0B29 N/A 8100 , 332C 333C N/A N/A . 342E 343E N/A N/A / 352F 353F N/A N/A ; 273B 273A N/A N/A ' 2827 2822 N/A N/A [ 1A5B 1A7B 1A1B N/A ] 1B5D 1B7D 1B1D N/A ` 2960 297E N/A N/A - 0C2D 0C5F 0C1F 8200 = 0D3D 0D2B N/A 8300 \ 2B5C 2B7C 2B1C N/A 151 Key Norm Shift Ctrl Alt ---- ---- ----- ---- --- F1 3B00 5400 5E00 6800 F2 3C00 5500 5F00 6900 F3 3D00 5600 6000 6A00 F4 3E00 5700 6100 6B00 F5 3F00 5800 6200 6C00 F6 4000 5900 6300 6D00 F7 4100 5A00 6400 6E00 F8 4200 5B00 6500 6F00 F9 4300 5C00 6600 7000 F10 4400 5D00 6700 7100 Enter 1C0D 1C0D 1C0A N/A Ins 5200 5230 N/A N/A Del 5300 532E N/A N/A Esc 011B 011B 011B N/A Home 4700 4737 7700 N/A End 4F00 4F31 7500 N/A PgUp 4900 4939 8400 N/A PgDn 5100 5133 7600 N/A 0F09 0F00 N/A N/A 0E08 0E08 0E7F N/A 4B00 4B34 7300 N/A 4D00 4D36 7400 N/A 4800 4838 N/A N/A 5000 5032 N/A N/A N/A 4C35 N/A N/A 372A N/A 7200 N/A 4A2D 4A2D N/A N/A 4E2B 4E2B N/A N/A 152 Appendix C - Window Output Escape Codes Escape Code Function ----------- -------- + - increase text attribute - - decrease text attribute A? - set text attribute to ? F? - set foreground text attribute to ? B? - set background text attribute to ? I - toggle intensity L - toggle blink X - reverse text attribute R? - set window row coordinate to ? C? - set window column coordinate to ? E? - erase ?: W - entire window, home cursor L - to end-of-line S - to end-of-window D?? - display ? character ? times Window output Escape codes are only available in the window TTY output string functions. Valid functions are wprintf(), wputs(), wputsw(), and others. Also, the text inside help files can contain Escape codes (excluding cross-reference items). The Escape code parameters MUST be character (byte) size. Parameters should be input as binary. For example, 5 would be '\005'. If you are using them from inside a wprintf() format string, you can use the '%c' format specifier to supply the parameter from the list of variables. Example Usage: wprintf("\033A%cNormal \033IBright\033I \033LBlink\033L" " \033XReverse\033X\n",CYAN|_BLUE); wprintf("\033R%c\033C%cRow %d, Col %d\n",3,5,3,5); wputs("\033DA\014 = 'A' 12 times\n"); 153 Appendix D - Format Control Characters FCC Description --- ----------- # Allows numeric characters '0' thru '9'. % Allows numeric characters '0' thru '9' and ' '. 9 Allows numeric characters '0' thru '9', '.', '-', and '+'. ? Allows any character. * Allows any printable character. A Allows alpha characters 'A' thru 'Z', 'a' thru 'z', and ' '. D Allows date characters '0' thru '9', '-', and '/'. F Allows legal MS-DOS filename characters. H Allows hexadecimal characters '0' thru '9', 'A' thru 'F', and 'a' thru 'f'. L Allows alpha characters 'A' thru 'Z', 'a' thru 'z', and ' '. Input letters will be converted to lowercase. M Allows alpha characters 'A' thru 'Z', 'a' thru 'z', and ' '. Input letters will be converted to mixed case P Allows alpha characters 'A' thru 'Z', 'a' thru 'z', and ' '. Input letters will be displayed as spaces, which is useful for entering passwords. T Allows telephone number characters '0' thru '9', '(', ')', '-', and ' '. U Allows alpha characters 'A' thru 'Z', 'a' thru 'z', and ' '. Input letters will be converted to uppercase. W Allows legal MS-DOS filename characters, including wildcards. X Allows alphanumeric characters 'A' thru 'Z', 'a' thru 'z', '0' thru '9', and ' '. Y Allows yes/no response characters 'Y', 'N', 'y', and 'n'. (space) Space characters can be used throughout a format string to improve its readability. < Start of inclusion set. An inclusion set allows you to specify the only allowable characters for a position. > End of inclusion set. Any characters listed between the left and right angle brackets are part of the set. [ Start of exclusion set. An exclusion set allows you to specify characters that aren't allowed in that position. ] End of exclusion set. Any characters listed between the left and right square brackets are part of the set. ' Start or end of quoted text that will be displayed either in the input field or as you are typing. All characters in between the start and end quotes will be displayed as text. " Same as the single quote. Is useful if you need to actually display a single quote as text. Note that in C, you must represent the double quote as: \" 154 ! Start and stop a command toggle sequence. Any characters in between the start and stop exclamation points are treated as command toggles. You can have as many command toggles as you like between the exclamation points. Valid command toggles are listed below. Command Toggles are valid with inputsf() and winputsf() only! Command Toggle Description ------- ----------- - Decreases text attribute. Valid with winputsf() only. + Increases text attribute. Valid with winputsf() only. C Toggles copying of quoted characters to receiving buffer. The default is off. E Toggles Escape checking. When on, if [Esc] is pressed, the receiving buffer will be emptied and an error code will be returned. The default for inputsf() is on. The default for winputsf() is the value of the global variable _winfo.esc. L Toggles lower-case conversion. When on, all input letters will be forced to lower-case. The default is off. M Toggles mixed-case conversion. When on, input letters will be forced to upper-case for the first letter of each word and lower-case for the remaining letters. The default is off. P Toggles password mode. When on, input characters will be echoed to the screen as spaces. This is useful for password fields. The default is off. R Toggles Return checking. When off, if [Enter] is pressed, it will be ignored. This is useful for forcing the user's input. Default is on. U Toggles upper-case conversion. When on, input letters will be forced to upper-case. The default is off. Examples: inputsf(name,"'Enter name: ' !UR! XXXXX !R! XXXXXXXXXX"); Prompts for name, inputs string from keyboard converting characters to uppercase as it goes, allows up to 15 alphanumeric characters as input. The return key is disabled until at least 5 characters have been entered. Input characters will be copied to the receiving buffer, name, which must be large enough to hold all 16 characters - 15 for the input string, and one for the terminating '\0'. winputsf(phone," 'Enter phone: '!RC! '(' ### ') ' ### '-' ####"); Prompts for a full phone number including area code, allows only digit characters and displays format punctuation as it goes. The entire field must be filled before return can be pressed. All of the characters except the prompt will be copied to the receiving buffer, phone. This buffer must be large enough to hold 15 characters - 10 for the phone number digits, 4 for the copied punctuation characters, and 1 for the terminating '\0'. 155 winpdef( 1,16,date,"<01>#'/'<0123>#'/'<89>#",0,0,NULL,0); Defines an input field that will accept a MMDDYY date. Note the use of the inclusion set '<' and '>' characters to aid in allowing only valid numbers. The receiving buffer, date, must be at least 7 characters to hold the 6 date characters and the terminating '\0'. 156 Appendix E - Input Field Editing Keys Key Action --- ------ LeftArrow cursor left RightArrow cursor right UpArrow cursor up DownArrow cursor down Ctrl-LeftArrow word left Ctrl-RightArrow word right Tab field right Shift-Tab field left Enter process field Ctrl-Enter process all fields Decimal (.) move to right side of decimal point Home beginning of field End end of field line / end of field Ctrl-Home beginning of first field Ctrl-End end of last field Ins toggle field insert mode Del delete character at cursor BackSpace delete character left Ctrl-BackSpace delete word left Ctrl-R restore field to original contents Ctrl-T delete word right Ctrl-U delete to end of field Ctrl-Y delete to end of last field Esc abort data entry (if Escape checking is on) 157