home *** CD-ROM | disk | FTP | other *** search
/ Shareware Supreme Volume 6 #1 / swsii.zip / swsii / 102 / QBS-0102.ZIP / QBS102-3.DOC < prev    next >
Text File  |  1993-03-24  |  46KB  |  1,298 lines

  1. ════════════════════════════════════════════════════════════════════════════════
  2.  Area:    QuickBasic
  3.   Msg:    #8647
  4.  Date:    02-09-93 16:56 (Public) 
  5.  From:    QUINN TYLER JACKSON      
  6.  To:      ALL                      
  7.  Subject: EMS Array Code        1/ 
  8. ────────────────────────────────────────────────────────────────────────────────
  9. ' Here is some code I posted a while back.  Thought it might give the
  10. ' echo a bit of a code boost...
  11.  
  12. DECLARE FUNCTION IsAllASCII (Txt$) AS INTEGER
  13. ' JackMack SuperArray Management Kit v1.0
  14. ' Released into the public domain on 24 December 1992
  15. ' in the interest of mutually beneficial programming practices.
  16. ' Rereleased February 1993
  17. ' Written by Quinn Tyler Jackson of
  18. ' JackMack Consulting & Development
  19. ' "Specializing in Custom DOS-based GUI applications and on-line
  20. '  documentation."
  21.  
  22. ' This array management tool is programmed for VBDOS 1.0, but may
  23. ' be fully compatible with BASIC PDS 7.x.  It uses advanced features
  24. ' not found in QuickBASIC 4.5, but these features MAY be worked out
  25. ' by enterprising programmers.  Words to look for in the source code
  26. ' include: PRESERVE.
  27.  
  28. ' Features of this application:
  29.  
  30. ' INTEGER and LONG numeric arrays can be stored in EMS memory, leaving
  31. ' space free for bigger and better things.  Arrays are referenced not by
  32. ' obscure numbers and handles, but by user assigned names that may include
  33. ' ANY character.  That means that an array COULD conceivably be called
  34. ' "This is my array."
  35.  
  36. ' STRING arrays are stored to a to virtual memory file, and are variable
  37. ' length.  Only their pointers are stored in RAM, and even these are stored
  38. ' safely out of the way in EMS.  In short, as long as disk space allows,
  39. ' one could have a 300,000 element string array, each element being between
  40. ' one and 32000 some odd characters long, and it wouldn't take up any more
  41. ' of DGROUP or far string space than any other STRING JmArray.
  42. ' Also note that STRING arrays are compressed onto the virtual disk file
  43. ' if they do not contain high-ASCII characters, to conserve disk space.
  44.  
  45. ' Some academic points illustrated by this program:
  46.  
  47. '   1) Pointer referencing,
  48. '   2) End user modifiable array names,
  49. '   3) "Handle-based" arrays,
  50. '   4) Virtual memory.
  51.  
  52. ' NOTE: To allow for INTEGER and LONG values to be passed back from the
  53. '       same function that returns STRING values, all values are passed
  54. '       back as STRING.  They must be converted thus:
  55. '
  56. '       ErrorCode = JmSET ("My array", 10, "100")
  57. '       IntegerValue = VAL(JmGet ("My array",10)
  58. '
  59. '       This is unfortunate, but allows one function to return ALL types
  60. '       of data, not just one per function.
  61.  
  62.  
  63. ' These seven routines are from Hanlin's PBCLONE 1.9 library.  Earlier
  64. ' versions of PBCLONE might work, too.
  65.  
  66. DECLARE FUNCTION IsASCII% (Ch$)
  67. DECLARE FUNCTION StrSqu$ (St$)
  68. DECLARE FUNCTION StrUnSq$ (St$)
  69. DECLARE SUB EMSClose (BYVAL ArrayHandle%)
  70. DECLARE SUB EMSOpen (Elements&, ElementType%, ArrayHandle%, ErrCode%)
  71. DECLARE SUB EMSGet (BYVAL ArrayHandle%, ElementNr&, Value AS ANY)
  72. DECLARE SUB EMSPut (BYVAL ArrayHandle%, ElementNr&, Value AS ANY)
  73.  
  74. ' These routines are local to this particular program.
  75. DECLARE FUNCTION JmGET$ (ArrayName$, Element AS LONG, ErrCode AS INTEGER)
  76. DECLARE FUNCTION JmDIM% (ArrayName$, Elements AS LONG, ArrayType%)
  77. DECLARE FUNCTION JmWORD (InExpression$, Index%) AS STRING
  78. DECLARE FUNCTION JmSET% (ArrayName$, Element AS LONG, Vlue AS STRING)
  79. DECLARE FUNCTION JmERASE% (ArrayName$)
  80.  
  81. OPTION BASE 1 ' I prefer things to start at one.  Humans tend to count that
  82.               ' way, don't you agree?
  83.  
  84. 'Some system constants.
  85. CONST BUFFER_MAX = 10           ' How many previously read strings to buffer.
  86. CONST VirtualFile = "JMVSA.$$$" ' Virtual string memory file.
  87. CONST StartSize = 10
  88.  
  89. 'Ye olde tradional Boolean logic constants
  90. CONST TRUE = (1 = 1)            ' I prefer (1=1) since it is compiler
  91.                                 ' independent, whereas -1 is specific to
  92.                                 ' MS BASICS.
  93. CONST FALSE = NOT TRUE
  94.  
  95. ' Array Types
  96. CONST Array_Integer = 1
  97. CONST Array_Long = 2
  98. CONST Array_String = 3
  99.  
  100. ' Errors that might happen
  101. CONST Err_EMS_Allocation = -1
  102. CONST Err_Bad_Subscript = -2
  103. CONST Err_Array_Not_Dimensioned = -3
  104. CONST Err_Overflow = -4
  105. CONST Err_DOS_Error = -5
  106.  
  107. ' PointerType for the array cross-reference table.
  108. TYPE PointerType
  109.     Elements AS LONG                ' How many array elements array has.
  110.  
  111.     Handle AS INTEGER               ' EMS handle of either data or ptr table
  112.                                     ' (String arrays use an EMS ptr table).
  113.  
  114.     ArrayType AS INTEGER            ' What type of array we're dealing with.
  115.  
  116.  
  117.     Accesses AS LONG                ' How many times this array is accessed.
  118. END TYPE
  119.  
  120. DEFINT A-Z
  121. '$DYNAMIC arrays are going to be used so they can be redimensioned.
  122.  
  123. ' PtrArray changes size and must be preserved when it does so.  Therefore,
  124. ' QuickBASIC users might have to rethink the logic I have used throughout.
  125. DIM SHARED PtrArray(StartSize) AS PointerType
  126.  
  127. REDIM SHARED AName$(StartSize)          ' Names of arrays.
  128. DIM SHARED VirtualHandle AS INTEGER     ' Handle of virtual memory file.
  129.  
  130. ' The simple sample application to show syntax follows here.  Normally, your
  131. ' program would go here....
  132.  
  133.  
  134. CLS
  135. ' A 300,000 element string array!  Requires lots of EMS for pointers!  A
  136. ' one million element array would require 4 Megs of free EMS, but wouldn't
  137. ' take up any more DGROUP or conventional memory than a two element array!
  138.  
  139. INPUT "This array can have any name you'd like: ", Array$
  140. ' Arrays can be named at the end-user level.  This is good for database
  141. ' applications and is a powerful feature.  The user is not forced to refer
  142. ' to his specific data by any contrived name other than the one he or she
  143. ' assigns!
  144.  
  145. nul = JmDIM(Array$, 1000, Array_String)
  146. IF nul < 0 THEN PRINT "ERROR": END
  147. PRINT nul
  148. PRINT "Getting data from array '" + Array$ + "'."
  149. nul = JmSET(Array$, 1000, "This is a test.  The test seems to have worked.")
  150.  
  151. PRINT JmGET(Array$, 1000, ErrCode)
  152.  
  153. nul = JmERASE("*") 'Be sure to do this to free EMS handles and memory!
  154. >>> Continued to next message
  155.  
  156.  * SLMR 2.1a * 
  157.  
  158. --- Maximus 2.01wb
  159.  * Origin: VKUG/VPCC QuickBasic Echo - Richmond, BC (1:153/151)
  160.  
  161.  
  162.  
  163. ════════════════════════════════════════════════════════════════════════════════
  164.  Area:    QuickBasic
  165.   Msg:    #8648
  166.  Date:    02-09-93 16:56 (Public) 
  167.  From:    QUINN TYLER JACKSON      
  168.  To:      ALL                      
  169.  Subject: EMS Array Code        2/ 
  170. ────────────────────────────────────────────────────────────────────────────────
  171. >>> Continued from previous message
  172. REM $STATIC
  173. FUNCTION IsAllASCII (Txt$) AS INTEGER
  174. FOR scan = 1 TO LEN(Txt$)
  175.     IF NOT IsASCII(MID$(Txt$, scan, 1)) THEN
  176.         IsAllASCII = FALSE
  177.         EXIT FUNCTION
  178.     END IF
  179. NEXT
  180. IsAllASCII = TRUE
  181. END FUNCTION
  182.  
  183. FUNCTION JmDIM (ArrayName$, Elements AS LONG, ArrayType) AS INTEGER
  184. STATIC ArrayPtr AS INTEGER
  185.  
  186. ' Get First Available spot in list.
  187. FOR scan = 1 TO UBOUND(PtrArray)
  188.     IF AName$(scan) = "" THEN
  189.         ArrayPtr = scan
  190.         Flag = TRUE
  191.         EXIT FOR
  192.     END IF
  193. NEXT scan
  194.  
  195. IF NOT Flag THEN ' We have to make room for a new array, since no spots left.
  196.     ArrayPtr = UBOUND(PtrArray) + 1
  197.     REDIM PRESERVE PtrArray(ArrayPtr) AS PointerType
  198.     REDIM PRESERVE AName$(ArrayPtr)
  199. END IF
  200.  
  201.  
  202. SELECT CASE ArrayType
  203.     CASE Array_Integer, Array_Long
  204.         AName$(ArrayPtr) = ArrayName$
  205.         PtrArray(ArrayPtr).Elements = Elements
  206.         PtrArray(ArrayPtr).ArrayType = ArrayType
  207.         EMSOpen Elements, Array_Type, Handle, ErrCode
  208.         PtrArray(ArrayPtr).Handle = Handle
  209.         IF ErrCode THEN
  210.             JmDIM = -1
  211.             EXIT FUNCTION
  212.         ELSE
  213.             JmDIM = Handle
  214.             EXIT FUNCTION
  215.         END IF
  216.  
  217.     CASE Array_String, Array_Compressed
  218.         AName$(ArrayPtr) = ArrayName$
  219.         PtrArray(ArrayPtr).Elements = Elements
  220.         PtrArray(ArrayPtr).ArrayType = ArrayType
  221.         IF NOT VirtualHandle THEN 'we haven't opened the virtual file yet.
  222.             VirtualHandle = FREEFILE
  223.             OPEN VirtualFile FOR BINARY AS VirtualHandle
  224.  
  225.         END IF
  226.         ' This EMS array is an array of POINTERS to file offsets.
  227.         EMSOpen Elements, Array_Long, Handle, ErrCode
  228.         PtrArray(ArrayPtr).Handle = Handle
  229.         IF ErrCode THEN
  230.             JmDIM = -1
  231.             EXIT FUNCTION
  232.         ELSE
  233.             JmDIM = Handle
  234.             EXIT FUNCTION
  235.         END IF
  236. END SELECT
  237.  
  238. END FUNCTION
  239.  
  240. FUNCTION JmERASE (ArrayName$)
  241.  
  242. IF ArrayName$ <> "*" THEN ' The asterix is intended to erase ALL JmArrays!!
  243.     FOR scan = 1 TO UBOUND(PtrArray)
  244.         IF ArrayName$ = AName$(scan) THEN
  245.                 'Release EMS being used by array.
  246.                 EMSClose PtrArray(scan).Handle
  247.                 'Show the name as blank so that it is freed for future use.
  248.                 AName$(scan) = ""
  249.                 Flag = TRUE
  250.                 EXIT FOR
  251.         END IF
  252.     NEXT scan
  253.     IF NOT Flag THEN
  254.         ' We tried to ERASE an array that didn't exist.  Names ARE
  255.         ' case sensitive, so "Quinn" and "quinn" are different.
  256.         JmERASE = Err_Array_Not_Dimensioned
  257.         EXIT FUNCTION
  258.     END IF
  259. ELSE
  260.     CLOSE VirtualHandle ' Close the virtual string file and
  261. '    KILL VirtualFile    ' get rid of it.
  262.  
  263.     FOR scan = 1 TO UBOUND(PtrArray)
  264.         IF AName$(scan) <> "" THEN
  265.             'Release EMS used by array.
  266.             EMSClose PtrArray(scan).Handle
  267.         END IF
  268.     NEXT scan
  269.     REDIM PtrArray(1) AS PointerType
  270.     REDIM AName$(1)
  271.     VirtualHandle = 0
  272. END IF
  273. END FUNCTION
  274.  
  275. FUNCTION JmGET (ArrayName$, Element AS LONG, ErrCode AS INTEGER) AS STRING
  276. STATIC BufferPtr
  277.  
  278.  
  279. FOR scan = 1 TO UBOUND(PtrArray)
  280.     IF ArrayName$ = AName$(scan) THEN
  281.         IF Element > PtrArray(scan).Elements THEN
  282.             ErrCode = Err_Bad_Subscript
  283.             EXIT FUNCTION
  284.         END IF
  285.         SELECT CASE PtrArray(scan).ArrayType
  286.             CASE Array_Integer
  287.                 EMSGet PtrArray(scan).Handle, Element, TempInt%
  288.                 JmGET = STR$(TempInt%)
  289.                 Flag = TRUE
  290.                 EXIT FOR
  291.  
  292.             CASE Array_Long
  293.                 EMSGet PtrArray(scan).Handle, Element, TempLong&
  294.                 JmGET = STR$(TempLong&)
  295.                 Flag = TRUE
  296.                 EXIT FOR
  297.  
  298.             CASE Array_String
  299.                 EMSGet PtrArray(scan).Handle, Element, EndPtr&
  300.  
  301.                 ON LOCAL ERROR GOTO DOSErrorGet
  302.                     ' First find the right spot in virtual file.
  303.                     SEEK VirtualHandle, EndPtr&
  304.                     ' Then find out how much data to read from file.
  305.                     GET VirtualHandle, , Leng%
  306.                     ' Then prepare an adequate buffer.
  307.                     Buffer$ = SPACE$(ABS(Leng%))
  308.                     ' And finally suck it in through the straw.
  309.                     GET VirtualHandle, , Buffer$
  310.                 ON LOCAL ERROR GOTO 0
  311. >>> Continued to next message
  312.  
  313.  * SLMR 2.1a * 
  314.  
  315. --- Maximus 2.01wb
  316.  * Origin: VKUG/VPCC QuickBasic Echo - Richmond, BC (1:153/151)
  317.  
  318.  
  319.  
  320. ════════════════════════════════════════════════════════════════════════════════
  321.  Area:    QuickBasic
  322.   Msg:    #8649
  323.  Date:    02-09-93 16:56 (Public) 
  324.  From:    QUINN TYLER JACKSON      
  325.  To:      ALL                      
  326.  Subject: EMS Array Code        3/ 
  327. ────────────────────────────────────────────────────────────────────────────────
  328. >>> Continued from previous message
  329.                 ' Negative lengths indicate previous compression.
  330.                 IF Leng% < 0 THEN Buffer$ = StrUnSq(Buffer$)
  331.                 JmGET = Buffer$
  332.                 Flag = TRUE
  333.                 EXIT FOR
  334.         END SELECT
  335.     END IF
  336. NEXT scan
  337.  
  338. IF NOT Flag THEN
  339.     ErrCode = Err_Array_Not_Dimensioned
  340.     EXIT FUNCTION
  341. END IF
  342.  
  343. EXIT FUNCTION
  344.  
  345. DOSErrorGet:
  346. ' Something happened that had to be trapped.
  347. ErrCode = Err_DOS_Error
  348. EXIT FUNCTION
  349.  
  350. END FUNCTION
  351.  
  352. FUNCTION JmSET (ArrayName$, Element AS LONG, Vlue AS STRING)
  353. FOR scan = 1 TO UBOUND(PtrArray)
  354.     IF ArrayName$ = AName$(scan) THEN
  355.         IF Element > PtrArray(scan).Elements THEN
  356.             JmSET = Err_Bad_Subscript
  357.             EXIT FUNCTION
  358.         END IF
  359.         SELECT CASE PtrArray(scan).ArrayType
  360.  
  361.             CASE Array_Integer
  362.                 TempInt& = VAL(Vlue)
  363.                 IF TempInt& > 32768 OR TempInt& < -32768 THEN
  364.                     ' Someone forgot his BASIC basics.
  365.                     JmSET = Err_Overflow
  366.                     EXIT FUNCTION
  367.                 END IF
  368.                 TempInt% = TempInt&
  369.                 ' Stuff it up there in EMS land.
  370.                 EMSPut PtrArray(scan).Handle, Element, TempInt%
  371.                 Flag = TRUE
  372.                 EXIT FOR
  373.  
  374.             CASE Array_Long
  375.                 TempLong& = VAL(Vlue)
  376.                 EMSPut PtrArray(scan).Handle, Element, TempLong&
  377.                 Flag = TRUE
  378.                 EXIT FOR
  379.  
  380.             CASE Array_String
  381.  
  382.  
  383.                 ' New string assignments added to end of virtual file.
  384.                 EndPtr& = LOF(VirtualHandle) + 1
  385.                 EMSPut PtrArray(scan).Handle, Element, EndPtr&
  386.                 ON LOCAL ERROR GOTO DOSErrorSet
  387.                     SEEK VirtualHandle, EndPtr&
  388.                     ' Add the string length to the string for later use.
  389.                     SELECT CASE IsAllASCII(Vlue)
  390.                         CASE TRUE
  391.                             'Compress string.
  392.                             Vlue = StrSqu(Vlue)
  393.                             ' Make it < 0 if compressed.
  394.                             Vlue = MKI$(-LEN(Vlue)) + Vlue
  395.                         CASE ELSE
  396.                             Vlue = MKI$(LEN(Vlue)) + Vlue
  397.                     END SELECT
  398.                     PUT VirtualHandle, , Vlue
  399.                 ON LOCAL ERROR GOTO 0
  400.                 Flag = TRUE
  401.                 EXIT FOR
  402.  
  403.         END SELECT
  404.     END IF
  405. NEXT scan
  406.  
  407. IF NOT Flag THEN
  408.     JmSET = Err_Bad_Array_Name
  409.     EXIT FUNCTION
  410. END IF
  411.  
  412. EXIT FUNCTION
  413. DOSErrorSet:
  414.     JmSET = Err_DOS_Error
  415.     EXIT FUNCTION
  416.  
  417. END FUNCTION
  418.  
  419.  
  420.  * SLMR 2.1a * 
  421.  
  422. --- Maximus 2.01wb
  423.  * Origin: VKUG/VPCC QuickBasic Echo - Richmond, BC (1:153/151)
  424.  
  425.  
  426.  
  427. ════════════════════════════════════════════════════════════════════════════════
  428.  Area:    QuickBasic
  429.   Msg:    #9372
  430.  Date:    02-08-93 17:35 (Public) 
  431.  From:    VICTOR YIU               
  432.  To:      ERIC MAYS                
  433.  Subject: GETINPUT    1/2          
  434. ────────────────────────────────────────────────────────────────────────────────
  435. Here's what you're looking for!
  436.  
  437. -!!!!!!!!!!!!!!!!!!!!!!!!!!-8<-!!!!!-8<-!-  snip here
  438.  
  439. ' released into public domain
  440. ' +-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-+
  441. ' |  GetInput.bas                               by Victor Yiu |
  442. ' |  ~~~~~~~~~~~~                                             |
  443. ' |    A full functioned replacement for INPUT.  Includes     |
  444. ' |  full line editing:  insert, typeover, delete, home/end,  |
  445. ' |  and next/previous word.  Also lets you specify maximum   |
  446. ' |  line length, or let use input until end of line.         |
  447. ' |    The code is specially written for clarity and ease of  |
  448. ' |  understanding.  All of the code is optimized to the max  |
  449. ' |  that I know how.                                         |
  450. ' |    In essence, it is just a full line editor.             |
  451. ' |                                                           |
  452. ' |  Syntax:                                                  |
  453. ' |     In$ = GetInput$(Prompt$, MaxLen%)                     |
  454. ' |                                                           |
  455. ' |  Prompt$ is the prompt that you want to be displayed when |
  456. ' |             user is inputting data, like "Your name? "    |
  457. ' |  MaxLen  is the maximum length that you will allow the    |
  458. ' |             user to type in.  Use "0" or "-1" to input it |
  459. ' |             to the end of the screen                      |
  460. ' +-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-+
  461.  
  462. '  Declarations
  463. DECLARE SUB Init ()
  464. DECLARE SUB Alarm ()
  465. DECLARE FUNCTION GetInput$ (Prompt$, MaxLen%)
  466.  
  467. DEFINT A-Z      ' use integers by default for speed
  468. COMMON SHARED Null$           ' set up some initial keys:
  469. COMMON SHARED LeftK$, RightK$ ' it is faster and clearer to use variables
  470. COMMON SHARED Home$, End$     ' (A$, B$) instead of constants ("d",
  471. COMMON SHARED Insert$, Delete$' "xyz", CHR$(3))
  472. COMMON SHARED CLeft$, CRight$ ' --> MY BENCHMARKS CONFIRM IT <--
  473. COMMON SHARED SpaceBar$
  474.  
  475. CONST False = 0, True = NOT False   ' set up boolean constants
  476.  
  477.     Null$ = CHR$(0)             ' define initial keys
  478.     SpaceBar$ = " "
  479.     Insert$ = Null$ + "R"
  480.     Delete$ = Null$ + "S"
  481.  
  482.     LeftK$ = Null$ + "K": RightK$ = Null$ + "M"
  483.     Home$ = Null$ + "G": End$ = Null$ + "O"
  484.     CLeft$ = Null$ + "s": CRight$ = Null$ + "t"
  485. CLS             ' clear screen
  486. COLOR 7, 0      ' use white on black
  487.  
  488.  
  489. In$ = GetInput$("Enter a string: ", -1)   ' input a string
  490.  
  491. PRINT
  492. PRINT "You typed ["; In$; "]"
  493.  
  494. ' +-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-+
  495. ' |  Alarm                                      by Victor Yiu |
  496. ' |  ~~~~~                                                    |
  497. ' |    Plays a tune                                           |
  498. ' +-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-+
  499. SUB Alarm
  500.  
  501.     SOUND 1000, .1
  502.  
  503. END SUB
  504.  
  505. FUNCTION GetInput$ (Prompt$, MaxLen)
  506.  
  507.     IF MaxLen < 1 THEN MaxLen = 80 - LEN(Prompt$) - POS(0)
  508.     ' 0 or -1 means all that will fit on the row
  509.     ' Adjusts MaxLen to max. len to the end of the line if user
  510.     ' passes in < 1
  511.     PRINT Prompt$;      ' print prompt
  512.     StartX = POS(0)     ' save cursor column, to use later as base
  513.     Cursor = 1          ' init. cursor
  514.     Insert = True       ' default mode: insert
  515.  
  516.     DO    ' start main loop
  517.         IF Update THEN      ' True if something changed in input
  518.             LOCATE , StartX, 0      ' locate at base
  519.             PRINT Out$; SpaceBar$;        ' print input plus a space
  520.             Update = False          ' reset flag
  521.         END IF
  522.  
  523.         LOCATE , Cursor + StartX - 1, 1, (NOT Insert) * -7, 16
  524.             ' locate cursor at end of text, with cursor on.
  525.             ' cursor shape is dependent on insertion mode
  526.         DO: I$ = INKEY$         ' wait for input
  527.         LOOP UNTIL LEN(I$)      ' --> NOTE:
  528.                                     ' using LEN(I$) is _MUCH_ faster than
  529.                                     ' using I$ <> ""
  530.  
  531. >>>>> Continued on next message...
  532.  
  533. --- Blue Wave/RA v2.10 [NR]
  534.  * Origin: Hard Disc Cafe / Houston Texas / (713) 589-2690 / (1:106/30.0)
  535.  
  536.  
  537.  
  538. ════════════════════════════════════════════════════════════════════════════════
  539.  Area:    QuickBasic
  540.   Msg:    #9373
  541.  Date:    02-08-93 17:35 (Public) 
  542.  From:    VICTOR YIU               
  543.  To:      ERIC MAYS                
  544.  Subject: GETINPUT    2/2          
  545. ────────────────────────────────────────────────────────────────────────────────
  546. >>>>>> Continued from last message...
  547.  
  548.         IF LEN(I$) = 1 THEN     ' branch according to len. of input
  549.             Update = True       ' set flag to update
  550.  
  551.             SELECT CASE ASC(I$)
  552.                 CASE IS >= 32   ' a normal char: just add it to string
  553.                IF (NOT Insert) OR (LEN(Out$) < MaxLen) THEN  ' within limits?
  554.                     ' able to add anymore?
  555.                         IF Cursor > 0 THEN    ' has user typed anything?
  556. '                 Out$ = LEFT$(Out$, Cursor - 1) + I$ + MID$(Out$, Cursor)
  557. '                 Out$ = LEFT$(Out$, Cursor - 1) + I$ + MID$(Out$, Cursor + 1)
  558.    Out$ = LEFT$(Out$, Cursor - 1) + I$ + MID$(Out$, Cursor - (NOT Insert))
  559.                         ELSE
  560.                             Out$ = I$    ' create new string
  561.                         END IF
  562.                         Cursor = Cursor + 1     ' advance cursor position
  563.                     ELSE
  564.                         Alarm           ' can't add, so beep at them
  565.                         Update = False  ' don't update
  566.                     END IF
  567.                 CASE 8          ' backspace
  568.                     IF LEN(Out$) AND (Cursor > 1) THEN 'can we backspace?
  569.                         Out$ = LEFT$(Out$, Cursor - 2) + MID$(Out$, Cursor)
  570.                         'remove 1 char. before cursor
  571.                         Cursor = Cursor - 1     ' adjust cursor
  572.                     ELSE
  573.                         Alarm
  574.                         Update = False
  575.                     END IF
  576.                 CASE 13     ' enter
  577.                     EXIT DO
  578.                 CASE 27     ' escape
  579.                     IF LEN(Out$) > 0 THEN     ' has user typed anything?
  580.                         LOCATE , StartX, 0    ' yes, so clear the string
  581.                         PRINT SPACE$(LEN(Out$) + 1);
  582.  
  583.                         Out$ = ""
  584.                         Cursor = 1      ' resetting cursor position
  585.                         Update = False  ' don't update:  no reason to
  586.                     ELSE
  587.                         EXIT DO         ' if nothing, just exit
  588.                     END IF
  589.             END SELECT
  590.         ELSE    ' extended ASCII code
  591.             SELECT CASE I$
  592.                 CASE LeftK$
  593.                     IF Cursor > 1 THEN
  594.                         Cursor = Cursor - 1     ' move cursor left
  595.                     ELSE
  596.                         Alarm
  597.                     END IF
  598.                 CASE RightK$
  599.  
  600.                     IF Cursor < LEN(Out$) + 1 THEN
  601.                         Cursor = Cursor + 1     ' move cursor right
  602.                     ELSE
  603.                         Alarm
  604.                     END IF
  605.                 CASE Delete$
  606.                     IF LEN(Out$) > 0 AND (Cursor < LEN(Out$)) THEN
  607.                         Out$ = LEFT$(Out$, Cursor - 1) + MID$(Out$, Cursor + 
  608. 1)
  609.                         Update = True
  610.                     ELSE
  611.                         Alarm
  612.                     END IF
  613.  
  614.                 CASE CLeft$     ' move to previous word
  615.                     IF Cursor > 2 THEN
  616.                         Temp = Cursor - 1     ' assume starting position
  617.                         DO                      ' start loop
  618.                             Temp = Temp - 1     ' adjust pointer
  619.                             IF ASC(MID$(Out$, Temp)) = 32 THEN  ' space?
  620.                                 Temp = Temp + 1  ' yes, so move cursor to
  621.                                 EXIT DO          ' next word & exit
  622.                             END IF
  623.                         LOOP UNTIL Temp = 1  ' just in case for no spaces
  624.                         Cursor = Temp           'adjust cursor
  625.                     ELSE
  626.                         Cursor = 1
  627.                     END IF
  628.                 CASE CRight$
  629.                     IF Cursor <= LEN(Out$) THEN 'only if not end of line
  630.                         Temp = INSTR(Cursor, Out$, SpaceBar$) ' find next 
  631. space
  632.                         IF Temp = 0 THEN            ' any spaces at all?
  633.                             Cursor = LEN(Out$) + 1  ' no, so just put at
  634.                                                     ' end of line
  635.                         ELSE
  636.                             Cursor = Temp + 1    ' yes, put after space
  637.                         END IF
  638.                     ELSE
  639.                         Cursor = LEN(Out$) + 1
  640.                     END IF
  641.                 CASE Home$
  642.                     Cursor = 1
  643.                 CASE End$
  644.                     Cursor = LEN(Out$) + 1
  645.                 CASE Insert$
  646.                     Insert = NOT Insert     ' if user pressed the insert
  647.                                             ' key, just toggle flag
  648.             END SELECT
  649.         END IF
  650.     LOOP
  651.  
  652.     LOCATE , , 0, 0, 16     ' restore cursor to invisible big block
  653.  
  654.     PRINT                   ' go to next line
  655.  
  656.     GetInput$ = Out$        ' assign function to value
  657. END FUNCTION                ' exit
  658.  
  659. -!!!!!!!!!-8<-!!!!!!!!!!!!-8<-!!!!- that's it!
  660.  
  661. Hope it helps!
  662. Victor
  663.  
  664. P.S.  Watch out for word-wrapped lines...
  665.  
  666. ... My spelling?  Oh, it's just line noise.  
  667.  
  668. --- Blue Wave/RA v2.10 [NR]
  669.  * Origin: Hard Disc Cafe / Houston Texas / (713) 589-2690 / (1:106/30.0)
  670.  
  671.  
  672.  
  673. ════════════════════════════════════════════════════════════════════════════════
  674.  Area:    QuickBasic
  675.   Msg:    #9376
  676.  Date:    02-08-93 18:04 (Public) 
  677.  From:    VICTOR YIU               
  678.  To:      ALL                      
  679.  Subject: MSGSPLIT ---->> 1/2      
  680. ────────────────────────────────────────────────────────────────────────────────
  681. Almost all of the active participants in this echo will find this program
  682. extremely useful!!!
  683.  
  684. 8<------8<--------8<-------8<----  Snip begins here: MSGSPLIT.BAS
  685.  
  686. ' ==============================================================
  687. ' MsgSplit v1.0 ■ (C) Copyright Victor Yiu, 1993. ■ Feb. 8, 1993
  688. ' ==============================================================
  689. ' A great message processor for posting source files.  Converts
  690. ' your source files into messages that can be posted in FidoNet
  691. ' echos efficiently.  NO MORE PULLING YOUR HAIR OUT when you
  692. ' want to post a file!!!
  693.  
  694. ' Significant features:
  695. ' ~~~~~~~~~~~~~~~~~~~~~
  696. ' o  Expands "tabs" (CHR$(9)s) into -REAL- spaces
  697. ' o  Removes unnecessary white space at end of lines
  698. '      (QB has a VERY nasty tendency to do that if you're not careful...)
  699. ' o  Warns poster and reader of lines of over 80 characters.  Helps prevent
  700. '      reader from dealing with much word-wrap problems.  First tries to
  701. '      trim spaces, to see if the line will be then <80 char.
  702. ' o  Ability to specify message length
  703. ' o  Ability to reserve lines on 1st message
  704. ' o  Can directly post to preset BlueWave numbers -- saves me a lot of time!
  705. ' o  Great code to study and find out how it works!  (Don't I say that about
  706. '      all my creations?!  <G>)  This program was written/produced/debugged
  707. '      in only 45 minutes!!
  708. '
  709. ' ===================== Comments are GREATLY welcomed! =====================
  710.  
  711. DEFINT A-Z
  712.  
  713. CONST True = -1, False = 0
  714. Tab$ = CHR$(9): TabSub$ = SPACE$(4)
  715.  
  716. CLS
  717. PRINT "MsgSplit v1.0 ■ (C) Copyright Victor Yiu, 1993."
  718. PRINT
  719.  
  720. INPUT "What is the filename to split [.BAS]"; FileName$
  721. IF LEN(FileName$) = 0 THEN END
  722.  
  723. INPUT "Name according to BlueWave conventions [y/N]"; BW$
  724. BW = UCASE$(LEFT$(BW$, 1)) = "Y"
  725.  
  726. IF BW THEN
  727.     INPUT "What echo # to post in"; OutN
  728.     OutN$ = LTRIM$(STR$(OutN))
  729.     INPUT "What message # to start posting in [1]"; FileOutNum
  730.     IF FileOutNum <= 0 THEN FileOutNum = 1
  731. ELSE
  732.     FileOutNum = 1
  733. END IF
  734.  
  735.  
  736. Chop = INSTR(FileName$, ".")
  737. IF Chop = 0 THEN
  738.     IF NOT BW THEN OutN$ = FileName$
  739.     FileName$ = UCASE$(FileName$ + ".BAS")
  740. ELSE
  741.     IF NOT BW THEN OutN$ = LEFT$(FileName$, Chop - 1)
  742.     FileName$ = UCASE$(FileName$)
  743. END IF
  744.  
  745. INPUT "How many lines per message [90]"; LPP
  746. IF LPP <= 10 THEN LPP = 90
  747.  
  748. INPUT "Reserve how many lines for first message [5]"; Reserve$
  749. IF LEN(Reserve$) THEN
  750.     Reserve = VAL(Reserve$)
  751. ELSE
  752.     Reserve = 5
  753. END IF
  754. PRINT
  755.  
  756. OPEN FileName$ FOR INPUT AS #1
  757. LinesOut = Reserve + 1
  758. OnMsgNumber = 1
  759. LPP = LPP - 4   ' lines per page
  760.  
  761. DO
  762.     Temp$ = LTRIM$(STR$(FileOutNum))
  763.     IF BW THEN
  764.         Ext$ = "000": MID$(Ext$, 4 - LEN(Temp$)) = Temp$
  765.     ELSE
  766.         Ext$ = Temp$
  767.     END IF
  768.  
  769. >>>>>>> Continued on next message >>>>>>>
  770.  
  771. --- Blue Wave/RA v2.10 [NR]
  772.  * Origin: Hard Disc Cafe / Houston Texas / (713) 589-2690 / (1:106/30.0)
  773.  
  774.  
  775.  
  776. ════════════════════════════════════════════════════════════════════════════════
  777.  Area:    QuickBasic
  778.   Msg:    #9377
  779.  Date:    02-08-93 18:04 (Public) 
  780.  From:    VICTOR YIU               
  781.  To:      ALL                      
  782.  Subject: MSGSPLIT ---->> 2/2      
  783. ────────────────────────────────────────────────────────────────────────────────
  784. Msg#: 2 >>>>>> Continued from last message: MSGSPLIT.BAS >>>>>>>
  785.  
  786.     OPEN OutN$ + "." + Ext$ FOR OUTPUT AS #2
  787.  
  788.     IF OnMsgNumber > 1 THEN
  789.         PRINT #2, "Msg#:"; OnMsgNumber; ">>>>>> ";
  790.         PRINT #2, "Continued from last message: "; FileName$; " >>>>>>>"
  791.         PRINT #2,
  792.     ELSE
  793.    PRINT #2, "8<------8<--------8<-------8<----  Snip begins here: "; 
  794. FileName$
  795.     PRINT #2,
  796.     END IF
  797.  
  798.     TooLong = False
  799.     FOR Trans = LinesOut TO LPP
  800.         IF NOT EOF(1) THEN
  801.             IF Trans = LinesOut THEN
  802.                 DO: LINE INPUT #1, Buf$
  803.                 LOOP WHILE LEN(Buf$) = 0
  804.             ELSE
  805.                 LINE INPUT #1, Buf$
  806.                 Buf$ = RTRIM$(Buf$)
  807.             END IF
  808.  
  809.             Tb = INSTR(Buf$, Tab$)  'remove those dang chr$(8)s (tabs)
  810.             IF Tb THEN
  811.                 DO
  812.                     Buf$ = LEFT$(Buf$, Tb - 1) + TabSub$ + MID$(Buf$, Tb + 1)
  813.                     Tb = INSTR(Tb, Buf$, Tab$)
  814.                 LOOP WHILE Tb
  815.             END IF
  816.  
  817.             IF LEN(Buf$) > 80 THEN
  818.                 T$ = LTRIM$(Buf$)
  819.                 IF LEN(T$) > 80 THEN
  820.                     IF NOT TooLong THEN
  821.                         TooLong = True
  822.                         Trans = Trans + 1
  823.                     END IF
  824.                 ELSE
  825.                     Buf$ = T$
  826.                     T$ = ""
  827.                 END IF
  828.             END IF
  829.             IF NOT ((Trans = LPP) AND LEN(Buf$) = 0) THEN
  830.                 PRINT #2, Buf$
  831.             END IF
  832.         END IF
  833.     NEXT
  834.     IF NOT EOF(1) THEN
  835.         PRINT #2,
  836.         PRINT #2, ">>>>>>> Continued on next message >>>>>>>"
  837.  
  838.     ELSE
  839.         PRINT #2,
  840.         PRINT #2, "8<------8<--------8<-------8<----  Snip ends!"
  841.         PRINT #2, "Message polishing/splitting was done by MSGSPLIT 1.0, ";
  842.         PRINT #2, "a Victor Yiu creation."
  843.         PRINT #2,
  844.     END IF
  845.     IF TooLong THEN
  846.         PRINT #2, "Warning -- some lines may be word wrapped in this message!"
  847.         PRINT "Warning: Message number"; OnMsgNumber; "has obese lines!"
  848.     END IF
  849.  
  850.     CLOSE #2
  851.     IF NOT EOF(1) THEN
  852.         OnMsgNumber = OnMsgNumber + 1
  853.         FileOutNum = FileOutNum + 1
  854.         LinesOut = 1
  855.     END IF
  856. LOOP UNTIL EOF(1)
  857.  
  858. CLOSE
  859. PRINT "Complete!"
  860. END
  861.  
  862.  
  863. 8<------8<--------8<-------8<----  Snip ends!
  864. Message polishing/splitting was done by MSGSPLIT 1.0, a Victor Yiu creation.
  865.  
  866. ... 1) Open mouth.   2) Insert shoe store.
  867. --- Blue Wave/RA v2.10 [NR]
  868.  * Origin: Hard Disc Cafe / Houston Texas / (713) 589-2690 / (1:106/30.0)
  869.  
  870.  
  871.  
  872. ════════════════════════════════════════════════════════════════════════════════
  873.  Area:    QuickBasic
  874.   Msg:    #10056
  875.  Date:    02-10-93 11:19 (Public) 
  876.  From:    FRANCOIS ROY             
  877.  To:      TRENT SHIRLEY            
  878.  Subject: CD-ROM Recognition       
  879. ────────────────────────────────────────────────────────────────────────────────
  880. You can use CALL INTERRUPT to read the ISO-9660 sectors via MSCDEX.  The VTOC
  881. (Volume Table of Contents) is accessible as shown below; I don't have its
  882. structure so can't tell you what the fields mean, but I can betcha no two are
  883. alike... the VTOC is a 2048-byte string; I defined my buffer in CDVTOC with a
  884. length of 4096 because for some reason 2048 gives me String Space Corrupt
  885. errors... the demo routine below prints the first 800 bytes of the VTOC but
  886. you may want to store the whole 2048 bytes as the CD's "fingerprint".
  887.  
  888. The code snippet below is for QB; QBX far strings need a small alteration.
  889.  
  890. DECLARE SUB CDVTOC (D$, V$)
  891. DECLARE SUB CDDRIVE (DR$)
  892.    TYPE REGTYPE  ' For CALL INTERRUPT
  893.      AX AS INTEGER
  894.      BX AS INTEGER
  895.      CX AS INTEGER
  896.      DX AS INTEGER
  897.      BP AS INTEGER
  898.      SI AS INTEGER
  899.      DI AS INTEGER
  900.      FL AS INTEGER
  901.      DS AS INTEGER
  902.      ES AS INTEGER
  903.    END TYPE
  904.    DIM SHARED INR AS REGTYPE, OUR AS REGTYPE
  905.    CALL CDDRIVE(D$)
  906.    PRINT "Drive:"; D$
  907.    CALL CDVTOC(D$, V$)
  908.    PRINT LEFT$(V$, 800)
  909.    END
  910.  
  911. SUB CDDRIVE (DR$) STATIC
  912.     DR$ = STRING$(32, 0)
  913.     INR.AX = &H150D
  914.     INR.BX = SADD(DR$)
  915.     INR.ES = SSEG(DR$)
  916.     CALL InterruptX(&H2F, INR, OUR)
  917.     IF ASC(DR$) = 0 THEN DR$ = "" ELSE DR$ = CHR$(ASC(DR$) + 65) + ":"
  918. END SUB
  919.  
  920. SUB CDVTOC (D$, V$) STATIC
  921. REM Reads VTOC
  922.     DR$ = STRING$(4096, 0)
  923.     INR.AX = &H1505
  924.     INR.BX = SADD(DR$)
  925.     INR.CX = INSTR("ABCDEFGHIJKLMNOP", LEFT$(D$, 1)) - 1
  926.     INR.DX = 0  ' 1st volume descriptor
  927.     INR.ES = SSEG(DR$)
  928.     CALL InterruptX(&H2F, INR, OUR)
  929. REM AX=1 is normal and indicates a standard vol. descr.
  930. REM AX=15 is 'Invalid Drive' and 21 is 'Not Ready'. 255 means no vol. desc.
  931.     IF OUR.AX > 1 THEN V$ = "Error" + STR$(OUR.AX) ELSE V$ = DR$
  932. END SUB
  933.  
  934.  
  935. --- ME2_1104
  936.  * Origin: Out of String Space - the Final Frontier (Fidonet 1:163/506.2)
  937.  
  938.  
  939.  
  940. ════════════════════════════════════════════════════════════════════════════════
  941.  Area:    QuickBasic
  942.   Msg:    #10145
  943.  Date:    02-10-93 12:35 (Public) 
  944.  From:    QUINN TYLER JACKSON      
  945.  To:      JEFF JOHNSTON            
  946.  Subject: Detecting video...       
  947. ────────────────────────────────────────────────────────────────────────────────
  948. JJ>     Is there maybe a
  949. JJ>     ASM program that would return the video being used so that the
  950. JJ>     program would just branch to another sub or use a different set of
  951. JJ>     variables for that particular video?
  952.  
  953. Try this'un.  I use it in all my programs, since they need to know
  954. if the program can handle EGA/VGA alternate text fonts.  Thanks go to
  955. Ethan Winer and his great book _BASIC Techniques and Utilities_. This
  956. function returns a value that tells you what monitor you're contending
  957. with. It's commented, so you should be able to figure what monitor
  958. yields what return value.  It doesn't bloat code with error trapping,
  959. either....  It also returns the video segment.
  960.  
  961.  
  962. Cheers,
  963.  
  964. Quinn
  965.  
  966. ___->8  CUT HERE  8<-------
  967.  
  968. DEFINT A-Z
  969. ' $INCLUDE: 'qb.bi'
  970.  
  971. DECLARE FUNCTION Monitor% (Segment)
  972. DIM SHARED InRegs AS RegType, OutRegs AS RegType
  973.  
  974.  
  975. FUNCTION Monitor% (Segment) STATIC
  976. DEF SEG = 0              'first see if it's color or mono
  977. Segment = &HB800         'assume color
  978.  
  979. IF PEEK(&H463) = &HB4 THEN
  980.  
  981.   Segment = &HB000       'assign the monochrome segment
  982.   Status = INP(&H3BA)    'get the current video status
  983.   FOR X = 1 TO 30000     'test for a Hercules 30000 times
  984.     IF INP(&H3BA) <> Status THEN
  985.       Monitor% = 2       'the port changed, it's a Herc
  986.       EXIT FUNCTION      'all done
  987.     END IF
  988.   NEXT
  989.   Monitor% = 1           'it's a plain monochrome
  990.  
  991. ELSE                     'it's some sort of color monitor
  992.  
  993.   InRegs.AX = &H1A00     'first test for VGA
  994.   CALL INTERRUPT(&H10, InRegs, OutRegs)
  995.   IF (OutRegs.AX AND &HFF) = &H1A THEN
  996.     Monitor% = 5         'it's a VGA
  997.     EXIT FUNCTION        'all done
  998.   END IF
  999.  
  1000.   InRegs.AX = &H1200     'now test for EGA
  1001.  
  1002.   InRegs.BX = &H10
  1003.   CALL INTERRUPT(&H10, InRegs, OutRegs)
  1004.   IF (OutRegs.BX AND &HFF) = &H10 THEN
  1005.     Monitor% = 3         'if BL is still &H10 it's a CGA
  1006.   ELSE
  1007.     Monitor% = 4         'otherwise it's an EGA
  1008.   END IF
  1009.  
  1010. END IF
  1011.  
  1012. END FUNCTION
  1013.  
  1014.  
  1015.  * SLMR 2.1a * 
  1016.  
  1017. --- Maximus 2.01wb
  1018.  * Origin: VKUG/VPCC QuickBasic Echo - Richmond, BC (1:153/151)
  1019.  
  1020.  
  1021. ════════════════════════════════════════════════════════════════════════════════
  1022.  Area:    QuickBasic
  1023.   Msg:    #10334
  1024.  Date:    02-10-93 02:12 (Public) 
  1025.  From:    ROB MCKEE                
  1026.  To:      CALVIN FRENCH            
  1027.  Subject: Communications through t 
  1028. ────────────────────────────────────────────────────────────────────────────────
  1029. Hello Calvin!
  1030.    You wrote in a message to Joe Negron:
  1031.  
  1032.  JN>   > PRINT #1,"+++" 
  1033.  CF>  
  1034.  CF> "+++" doesn't always work. To do it properly, you need to
  1035.  CF> read   the modem register [just a second let me get my
  1036.  CF> manual] "S2" and   see what it is. It's 043 normally, and
  1037.  CF> that's ASCII "+++".   Although I diddn't read the messages,
  1038.  CF> I picked up on this. This   can cause some _very_ annoying
  1039.  CF> bugs in some cases, I imagine.   Hope that helps out, 
  1040.  
  1041. If it is set to >128 then the Escape Character is disabled on 90% of modems  
  1042.  
  1043. The proper way to do it is:
  1044.  During program Start up.. Psuedo code follows
  1045.  
  1046.  IF NOT CD% then
  1047.     Print #ComPort,"ATS2?"
  1048.     GetLine Comport, Theline$
  1049.     If TheLine$= "ATS2?" then
  1050.         GetLine Comport, Theline$
  1051.         If TheLine$= "" then
  1052.             GetLine Comport, Theline$
  1053.         End if
  1054.     endif
  1055.     ModemEscape$=chr$(val(TheLine$))
  1056.     if ModemEscape$< chr$(128) then
  1057.         ModemEscape$= True
  1058.     else
  1059.         ModemEscape$= Else
  1060.     endif
  1061.     Connection%= False
  1062.  Else
  1063.     ' Assume "+" since modem is talking to somebody
  1064.     ' and the connection is hot
  1065.     ModemEscape$="+"
  1066.     ModemEscape$= True
  1067.     Connection%= True
  1068.  Endif
  1069.  
  1070.  Then to Issue the Escape String
  1071.  
  1072.  delay!=.55
  1073.  d!=(Timer + Delay!) mod 86400&
  1074.  If D!<timer then Do: loop until Int(Timer=0)
  1075.  Do: Loop until Timer=>d!
  1076.  ? #ComPort, ModemEscape$+ModemEscape$+ModemEscape$;
  1077.  d!=(Timer + Delay!) mod 86400&
  1078.  If D!<timer then Do: loop until Fix(Timer)=0
  1079.  Do: Loop until Timer=>d!
  1080.  WaitFor ComPort,"OK"
  1081.  ' do what ever you need to do.....
  1082.  
  1083.  
  1084.  You also have to be aware of modems that use the TIES escape which is 
  1085. "+++AT" and doesn't use the Hayes Time guard before or after the Escape 
  1086. sequence.  To further Explain here is a Healthy quote from the HAYES 
  1087. WhitePaper on TIES which is available from the HAYES BBS:
  1088.  Hayes Microcomputer.......... GA 1-404-446-6336 96V
  1089.  
  1090. As part of his intensive research in the development of the original Hayes 
  1091. Smartmodem, Dale Heatherington solved this inherent limitation by  
  1092. surrounding the escape code, a sequence of characters, with guard times  on 
  1093. both sides to alert the modem that the sequence is distinguished from  a 
  1094. typical string of characters in a file transmission.  This escape  sequence 
  1095.  
  1096.                 <guard time>    <escape code>    <guard time>  
  1097.  
  1098. virtually eliminates the limitation inherent in a data-dependent escape  
  1099. sequence because of its use of time and because it does not depend on the  
  1100. probability of character occurrence in a stream of data.  It is virtually  
  1101. impossible for the Hayes escape sequence with guard time to appear in a  file 
  1102. transfer and cause an unintentional escape using the common file  transfer 
  1103. protocols.
  1104.  
  1105. Dale Heatherington's invention led to the issuance of United States  Patent 
  1106. Number 4,549,302, the Modem With Improved Escape Sequence With  Guard Time 
  1107. Mechanism, often called the Hayes '302 Patent, and  corresponding patents in 
  1108. a number of countries.  The Hayes '302 Patent  ensures that modems escape or 
  1109. change to the Command Mode of operation  reliably and without the possibility 
  1110. that data alone could trigger the  escape.  In over eleven years of use of 
  1111. the Hayes '302, Hayes has never  received a complaint about an unintentional 
  1112. escape.  In addition, this  mechanism was copied by almost everyone in the 
  1113. industry making it one of  the most widely adopted and enduring defacto 
  1114. standards.
  1115.  
  1116.  
  1117. This "new" escape mechanism is called Time Independent Escape Sequence or 
  1118. TIES.  The name appears to derive from the way in which the escape  sequence 
  1119. works because it does not make use of time as the Hayes '302  does.  TIES 
  1120. depends entirely upon the appearance of the escape sequence  in the stream of 
  1121. data being received by the modem.  The TIES escape  mechanism is similar to 
  1122. the escape mechanism in use at the time of the  invention of the Hayes '302 
  1123. in that an escape can be triggered by the  data being sent as part of a file 
  1124. transfer.
  1125.  
  1126. TIES - What Is It?
  1127.  
  1128. The simplest escape sequence for TIES is "+++AT<CR>" where "+++" stands  for 
  1129. any escape character and "<CR>" represents carriage return or any  character 
  1130. assigned in the modem registers by the AT command set which  designates the 
  1131. end of the command. When that series of characters appears  in the data 
  1132. stream, the modem can "escape" or change from 
  1133. Receive/Transmit Mode to Command Mode of operation.  In effect, what  happens 
  1134. at that point in the transmission is that the flow of data stops.   The flow 
  1135. of data would halt simply because the characters which make up  the escape 
  1136.  
  1137. sequence would have appeared in the data being transmitted. 
  1138.  
  1139.  
  1140.  Catcha Later , I'll see you on the flip side - Rob
  1141.  
  1142. --- timEd/B6
  1143.  * Origin: Another Quik_Bas Point in Richmond, CA (1:125/411)
  1144.  
  1145.  
  1146. ════════════════════════════════════════════════════════════════════════════════
  1147.  Area:    QuickBasic
  1148.   Msg:    #11847
  1149.  Date:    02-12-93 05:00 (Public) 
  1150.  From:    ROB MCKEE                
  1151.  To:      RUSTY GORDON             
  1152.  Subject: LIMITING THE LENGTH OF IN
  1153. ────────────────────────────────────────────────────────────────────────────────
  1154. Hello Rusty!
  1155.    You wrote in a message to All:
  1156.  
  1157.  RG> This may sound like a stupid question but I have 8
  1158.  RG> Quickbasic books and cannot find the answer.
  1159.  RG> I understand how to limit the size of a string using 
  1160.  RG> DIM variable$ as string * 15 etc... but how do I put a limit
  1161.  RG> to the  number of characters the user can enter as in the
  1162.  RG> sample below: 
  1163.  
  1164.  RG> Enter Feature Name ▒▒▒▒▒▒▒▒▒▒▒▒▒▒.
  1165.  
  1166.  -------------------------8<--------------------------------  DECLARE 
  1167. FUNCTION GINPUT$ (MaxLen%,Fill%)
  1168.  ' ? GINPUT$(44,176) ' Example of Usage
  1169.  ' END
  1170.  
  1171.  FUNCTION GINPUT$ (MaxLen%, Fill%)
  1172.  Fill$= CHR$(Fill%)
  1173.  r = CSRLIN
  1174.  c = POS(0)
  1175.  PRINT STRING$(MaxLen%,Fill$);
  1176.  LOCATE r, c, 1, 6, 7
  1177.  DO
  1178.      PRINT "";
  1179.      DO
  1180.      'GOSUB UpdateStatusLine
  1181.      i$ = INKEY$
  1182.      LOOP WHILE i$ = ""
  1183.      SELECT CASE i$
  1184.      CASE " " TO "z"
  1185.          IF LEN(Worki$) < MaxLen% THEN
  1186.              Worki$ = Worki$ + i$
  1187.              PRINT i$;
  1188.          END IF
  1189.      CASE CHR$(8)
  1190.          IF LEN(Worki$) = 1 THEN
  1191.              Worki$ = ""
  1192.              LOCATE r, c, 0
  1193.              PRINT STRING$(MaxLen%,Fill$);
  1194.              LOCATE r, c, 1, 6, 7
  1195.          ELSEIF LEN(Worki$) > 1 THEN
  1196.              Worki$ = LEFT$(Worki$, LEN(Worki$) - 1)
  1197.              PRINT CHR$(29); Fill$; CHR$(29);
  1198.          END IF
  1199.     CASE CHR$(0) + "w"  ' Control-Home Erase Line
  1200.              Worki$ = ""
  1201.              LOCATE r, c, 0
  1202.              PRINT STRING$(MaxLen%,Fill$);
  1203.              LOCATE r, c, 1, 6, 7
  1204.     CASE CHR$(10), CHR$(13)  ' Line Feed or Return Exit with String          
  1205. EXIT DO
  1206.     CASE CHR$(27)
  1207.  
  1208.          GBQuitAction = True   ' A Shared Variable for Exiting Program        
  1209.   EXIT FUNCTION         ' You don't Have to use it (True=-1 and     END 
  1210. SELECT                 ' is a CONST False = 0, True = NOT False)  LOOP
  1211.  GINPUT$ = Worki$
  1212.  END FUNCTION
  1213.  -------------------------8<-------------------------------- 
  1214.  
  1215.  Catcha Later , I'll see you on the flip side - Rob
  1216.  
  1217. --- timEd/B6
  1218.  * Origin: Another Quik_Bas Point in Richmond, CA (1:125/411)
  1219.  
  1220.  
  1221. ════════════════════════════════════════════════════════════════════════════════
  1222.  Area:    QuickBasic
  1223.   Msg:    #12045
  1224.  Date:    02-11-93 18:10 (Public) 
  1225.  From:    DICK DENNISON            
  1226.  To:      VICTOR YIU               
  1227.  Subject: CRC-16 and CRC-32        
  1228. ────────────────────────────────────────────────────────────────────────────────
  1229. VY>     Can anyone tell me how to modify Rich's QBCRC10 CRC-32 maker to ma
  1230. VY> 16-bit CRCs?  I already have the CRC-32 code, so reposting it is unnec
  1231. VY> Thanks!
  1232.   'From Donn Bly:
  1233.  
  1234. DECLARE FUNCTION Computecrc& (x$)
  1235. 'OPEN "ccit.bas" FOR OUTPUT AS 1
  1236. CLS
  1237. FOR x = 0 TO 255
  1238.     crc& = Computecrc&(CHR$(x))
  1239.     PRINT HEX$(crc&),
  1240. NEXT
  1241.  
  1242. FUNCTION Computecrc& (x$)
  1243. ' ComputeCRC - Copyright (C) 1989, Donn Bly, 1:236/7.0
  1244. '
  1245. ' Standard Donn Bly Licencing Agreement:
  1246. '  This code may be used for anything that you want, except for profit.  I
  1247. f
  1248. '  you want to profit from my work you had better talk to me first.
  1249. '  NOTE: The CRC Polynomial was redone by Dick Dennison for CCIT16
  1250. STATIC InputByte AS INTEGER, CRCword AS LONG, c%, FeedBackBit AS INTEGER
  1251. '
  1252. ' CRC Calculation Polynomial = X^16+X^12+X^5+X^0     (CCIT 16)
  1253. '
  1254. ' X$ is the block on which to compute the CRC
  1255. '
  1256. CRCword = 0  'this line is Dick's
  1257. FOR c% = 1 TO LEN(x$)
  1258.    InputByte = ASC(MID$(x$, c%, 1))
  1259.    FeedBackBit = ((CRCword AND 32768) = 32768) XOR ((InputByte AND 128) = 
  1260. 128)
  1261.    CRCword = ((CRCword AND 32767&) * 2&)
  1262.    IF FeedBackBit THEN CRCword = CRCword XOR &H1021&
  1263.    FeedBackBit = ((CRCword AND 32768) = 32768) XOR ((InputByte AND 64) = 6
  1264. 4)
  1265.    CRCword = ((CRCword AND 32767&) * 2&)
  1266.    IF FeedBackBit THEN CRCword = CRCword XOR &H1021&
  1267.    FeedBackBit = ((CRCword AND 32768) = 32768) XOR ((InputByte AND 32) = 3
  1268. 2)
  1269.    CRCword = ((CRCword AND 32767&) * 2&)
  1270.    IF FeedBackBit THEN CRCword = CRCword XOR &H1021&
  1271.    FeedBackBit = ((CRCword AND 32768) = 32768) XOR ((InputByte AND 16) = 1
  1272. 6)
  1273.    CRCword = ((CRCword AND 32767&) * 2&)
  1274.    IF FeedBackBit THEN CRCword = CRCword XOR &H1021&
  1275.    FeedBackBit = ((CRCword AND 32768) = 32768) XOR ((InputByte AND 8) = 8)
  1276.    CRCword = ((CRCword AND 32767&) * 2&)
  1277.    IF FeedBackBit THEN CRCword = CRCword XOR &H1021&
  1278.    FeedBackBit = ((CRCword AND 32768) = 32768) XOR ((InputByte AND 4) = 4)
  1279.    CRCword = ((CRCword AND 32767&) * 2&)
  1280.    IF FeedBackBit THEN CRCword = CRCword XOR &H1021&
  1281.    FeedBackBit = ((CRCword AND 32768) = 32768) XOR ((InputByte AND 2) = 2)
  1282.  
  1283.    CRCword = ((CRCword AND 32767&) * 2&)
  1284.    IF FeedBackBit THEN CRCword = CRCword XOR &H1021&
  1285.    FeedBackBit = ((CRCword AND 32768) = 32768) XOR ((InputByte AND 1) = 1)
  1286.    CRCword = ((CRCword AND 32767&) * 2&)
  1287.    IF FeedBackBit THEN CRCword = CRCword XOR &H1021&
  1288. NEXT c%
  1289. Computecrc& = CRCword&
  1290. END FUNCTION
  1291.  'Sorry about the wrap.  This is for CCIT16 (the xmodem type).
  1292.  
  1293. --- VP [DOS] V4.09e
  1294.  * Origin: The MailMan  (914)374-3903 NY Quick Share Pt #7 *HST (1:272/34)
  1295.  
  1296.  
  1297.  
  1298.