home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / forth / compiler / fpc / tutor / l6p050 < prev    next >
Text File  |  1990-07-15  |  5KB  |  119 lines

  1.        ╔════════════════════════════════════════════════════╗
  2.        ║ Lesson 6 Part 050  F-PC 3.5 Tutorial by Jack Brown ║
  3.        ╚════════════════════════════════════════════════════╝
  4.  
  5.             ┌──────────────────────────────────────┐
  6.             │  Packing Forth Strings ( continued ) │
  7.             └──────────────────────────────────────┘
  8.  
  9. Here is what the word CPACK defined below will do for us. Move the
  10. un-counted string of length n at memory location addr-from to memory
  11. location addr-to using Forth's packed string format.  This means that
  12. the first byte at addr-to must be the string length.
  13.  
  14. : CPACK  ( addr-from addr-to n -- )
  15.          SWAP 2DUP  C!    ( addr-from n addr-to ) \ Store string count.
  16.          1+  SWAP  CMOVE  ;  \ skip over count and move string.
  17.  
  18. Try the following example to verify the correct operation of CPACK
  19.   CREATE BUFFER2   80 ALLOT <enter>
  20.   READLINE  <enter>
  21.   BUFFER1  BUFFER2  LEN @  CPACK  <enter>
  22.   BUFFER2  COUNT  DUMP    <enter>
  23.   BUFFER2  COUNT  TYPE    <enter>
  24.  
  25.              ┌───────────────────────┐
  26.              │  Truncating Strings   │
  27.              └───────────────────────┘
  28.  
  29. One commonly required string operation is the truncation of slashing of
  30. n characters from the beginning of a string.  This can be accomplished
  31. by the Forth word /STRING  "slash-string".  In the high level definition
  32. of /STRING below  addr'= addr+n  and  len'= len-n .  Note that there is
  33. no checking performed to insure that len > n so programmer beware.  You
  34. should also be aware that the original string remains intact and should
  35. you want to retain the string in its shortened form you should use the
  36. word CPACK previously defined to move it to its new resting place.
  37.  
  38. \ Chopping n characters from the beginning of a string
  39. : /STRING  ( addr len n  addr' len' )
  40.         ROT OVER + -ROT - ;
  41.  
  42. Another common operation required is the removal of any trailing blanks
  43. at the end of a string before it is displayed or moved to some other
  44. location.  This can be accomplished by the forth word -TRAILING
  45.  
  46. \  Remove trailing blanks from a string.
  47. :  -TRAILING ( addr count1 -- addr count2 )
  48.         DUP  0
  49.         ?DO                \ Examine each character if any.
  50.             2DUP + 1-      \ Address of last character.
  51.             C@ BL <>       \ Is this character a blank?
  52.             IF LEAVE THEN  \ If its not we are done.
  53.             1-             \ Decrease count by 1 to shorten.
  54.          LOOP ;
  55.  
  56. ╓─────────────╖
  57. ║ Problem 6.6 ║
  58. ╙─────────────╜
  59. a) Write a version of /STRING that provides an error message at run time
  60.    if the number of characters to be slashed is greater than the
  61.    original string length.
  62. b) What does -TRAILING do i) if len=0? ii) if len=1? iii) if string is
  63.    all blanks?
  64. c) Write word a high level definition for
  65.    -LEADING ( addr len -- addr' len' )
  66.    Which trims off an leading blanks from a the string at addr returning
  67.    the adjusted address as addr' and the shortened length as len'.
  68.    What would your definition do  i)  if len=0? ii) if len=1?
  69.    iii) if the input string is all blanks?
  70.  
  71.            ┌──────────────────────────────────────┐
  72.            │  Looking for Matches and Mismatches  │
  73.            └──────────────────────────────────────┘
  74.  
  75. F-PC has a number of other string primitives.  You may find SKIP which
  76. looks for a mismatching character and SCAN which looks for a matching
  77. character useful.
  78.  
  79. SKIP    ( addr len char -- addr' len' )
  80. Given the address and length of a string, and a character to look for,
  81. run through the string while we continue to find the character.  Leave
  82. the address of the *mismatch* and the length of the remaining string.
  83.  
  84. SCAN    ( addr len char -- addr' len' )
  85. Given the address and length of a string, and a character to look for,
  86. run through the string until we find the character.  Leave the address
  87. of the *match* and the length of the remaining string.
  88.  
  89. To keep this straight think.... SKIP to mismatch, SCAN for match
  90.  
  91.       ┌────────────────────────────────────────────────┐
  92.       │  Converting a Digit Only String Into a Number  │
  93.       └────────────────────────────────────────────────┘
  94.  
  95. CONVERT  ( ud1 addr1 -- ud2 addr2 )
  96. Convert a counted string starting at addr1 or an uncounted string
  97. starting at addr1+1 accumulating number into ud1. Conversion stops at
  98. first non digit character whose location, addr2, is left on the stack.
  99. addr1 is usually the address of a counted or packed digit string.  The
  100. first digit of the string to be converted will be at addr1+1 . ud2 is
  101. ud1 with the addition of the accumulated digits. The character count or
  102. digit that may be at addr1 is not used by CONVERT.  Examples:
  103.  
  104. CREATE DSTRING ," -456.123" <enter> ok
  105. 0 0 DSTRING CONVERT .S  <enter> [3]      0       0   29916  ok
  106. C@ EMIT <enter>  - ok   D. <enter> 0  ok
  107. \ Nothing is converted since the non digit - is encountered immediately
  108. 0 0 DSTRING 1+ CONVERT .S  <enter> [3]    456       0   29920  ok
  109. DUP C@ . <enter> 46  ok DUP C@ EMIT <enter> . ok
  110. \ 456 is converted to binary, conversion is stopped by decimal point.
  111. CONVERT .S  <enter> [3]  62907       6   29924  ok
  112. C@ . <enter> 32  ok  D. <enter> 456123  ok
  113. \ Conversion is restarted where we left off and 123 are accumulated.
  114. \ Conversion is stopped by the trailing blank.
  115.  
  116. ┌────────────────────────────────────┐
  117. │  Please Move to Lesson 6 Part 060  │
  118. └────────────────────────────────────┘
  119.