home *** CD-ROM | disk | FTP | other *** search
/ stazsoftware.com / www.stazsoftware.com.tar / www.stazsoftware.com / futurebasic / tech-notes.php?v=12.orig < prev    next >
Text File  |  2010-08-22  |  9KB  |  354 lines

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  2. <html>
  3. <head>
  4. <title>Staz Software</title>
  5. <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  6. <style type="text/css">
  7.  
  8. body{
  9. background-color: #365488;
  10. border-top: 20px solid #365488;
  11. margin: 0px;
  12. }
  13.  
  14. a{
  15. color: #00f;
  16. text-decoration: none;
  17. }
  18.  
  19. a:hover{
  20. color: #00f;
  21. text-decoration: underline;
  22. }
  23.  
  24. p{
  25. margin: 0px;
  26. padding-left: 0px;
  27. padding-top: 0px;
  28. padding-right: 0px;
  29. padding-bottom: 10px;
  30. }
  31.  
  32. h1{
  33. font-size: 23px;
  34. padding-left: 2px;
  35. padding-top: 4px;
  36. padding-right: 5px;
  37. padding-bottom: 2px;
  38. margin-left: -2px;
  39. margin-top: 0px;
  40. margin-right: 0px;
  41. margin-bottom: 10px;
  42. background-color: #e7edf6;
  43. }
  44.  
  45. h2{
  46. font-size: 19px;
  47. padding: 0px;
  48. padding: 0px;
  49. margin-left: 0px;
  50. margin-top: 0px;
  51. margin-right: 0px;
  52. margin-bottom: 10px;
  53. }
  54.  
  55. h3{
  56. font-size: 15px;
  57. padding: 0px;
  58. margin-left: 0px;
  59. margin-top: 0px;
  60. margin-right: 0px;
  61. margin-bottom: 10px;
  62. }
  63.  
  64. hr{
  65. background-color: #b7bbc2;
  66. height: 1px;
  67. border: 0px;
  68. margin-top: 0px;
  69. margin-left: 0px;
  70. margin-bottom: 10px;
  71. margin-right: 0px;
  72. padding: 0px;
  73. }
  74.  
  75. span#pre,span.pre{
  76. color: #996633;
  77. font-size: 12px;
  78. font-family: monospace;
  79. }
  80.  
  81. pre{
  82. color: #996633;
  83. font-size: 12px;
  84. font-family: monospace;
  85. padding: 0;
  86. margin-left: 0px;
  87. margin-top: 0px;
  88. margin-right: 0px;
  89. margin-bottom: 10px;
  90. }
  91.  
  92. table.w{
  93. background-image: url('../graphics/site/window/middle.png');
  94. background-repeat: repeat-y;
  95. width: 880px;
  96. margin-left: auto;
  97. margin-right: auto;
  98. }
  99.  
  100. td.w-top{
  101. background-image: url('../graphics/site/window/top.png');
  102. background-repeat: no-repeat;
  103. padding-left: 15px;
  104. padding-right: 15px;
  105. text-align: center;
  106. height: 60px;
  107. min-height: 60px;
  108. font-size: 1px;
  109. line-height: 1px;
  110. }
  111.  
  112. td.w-middle{
  113. padding-top: 0px;
  114. padding-left: 15px;
  115. padding-right: 15px;
  116. vertical-align: top;
  117. }
  118.  
  119. td.w-bottom{
  120. background-image: url('../graphics/site/window/bottom.png');
  121. background-repeat: no-repeat;
  122. height: 25px;
  123. min-height: 25px;
  124. }
  125.  
  126. table.w-content{
  127. float: left;
  128. clear: none;
  129. border: 10px solid #e7edf6;
  130. width: 650px;}
  131.  
  132. td.w-content{
  133. border-left: 1px solid #cfd4dc;
  134. border-top: 1px solid #cfd4dc;
  135. border-right: 1px solid #b7bbc2;
  136. border-bottom: 1px solid #b7bbc2;
  137. padding-left: 20px;
  138. padding-top: 20px;
  139. padding-right: 20px;
  140. padding-bottom: 10px;
  141. background-color: #fff;
  142. vertical-align: top;
  143. min-height: 500px;
  144. }
  145.  
  146. table.w-sidebar{
  147. border-top: 10px solid #e7edf6;
  148. border-right: 10px solid #e7edf6;
  149. border-bottom: 10px solid #e7edf6;
  150. background-color: #e7edf6;
  151. width: 199px;
  152. float: right;
  153. clear: none;
  154. }
  155.  
  156. td.w-sidebar{
  157. border-left: 1px solid #cfd4dc;
  158. border-top: 1px solid #cfd4dc;
  159. border-right: 1px solid #b7bbc2;
  160. border-bottom: 1px solid #b7bbc2;
  161. background-color: #fff;
  162. text-align: center;
  163. padding-left: 10px;
  164. padding-top: 20px;
  165. padding-right: 10px;
  166. padding-bottom: 10px;
  167. }
  168.  
  169. td.w-sidebar img{
  170. border: 0px;
  171. }
  172.  
  173. table.w-tabs{
  174. background-image: url('../graphics/site/tabs/background.png');
  175. background-position: bottom center;
  176. height: 40px;
  177. margin-top: auto;
  178. }
  179.  
  180. td.w-tabs{
  181. text-align: center;
  182. vertical-align: bottom;
  183. }
  184.  
  185. td.w-tabs img{
  186. border: 0px;
  187. }
  188.  
  189. td.w-tabs a{
  190. border: 0px;
  191. }
  192.  
  193. input.text-box{
  194. border-left: 1px solid #b7bbc2;
  195. border-top: 1px solid #b7bbc2;
  196. border-right: 1px solid #cfd4dc;
  197. border-bottom: 1px solid #cfd4dc;
  198. background-color: #fff;
  199. }
  200.  
  201. input.push-button{
  202. border-left: 1px solid #cfd4dc;
  203. border-top: 1px solid #cfd4dc;
  204. border-right: 1px solid #b7bbc2;
  205. border-bottom: 1px solid #b7bbc2;
  206. background-color: #fff;
  207. }
  208. </style>
  209. </head>
  210. <body>
  211. <table class="w" border="0" cellpadding="0" cellspacing="0">
  212. <tr>
  213. <td class="w-top">
  214.  
  215. <img src="../graphics/site/window/title.png" alt="Staz Software">
  216. <table class="w-tabs" border="0" cellpadding="0" cellspacing="0" width="100%">
  217. <tr>
  218. <td class="w-tabs"><a href="../index.php"><img src="../graphics/site/tabs/home.png" alt="Home"></a><a href="../futurebasic/index.php"><img src="../graphics/site/tabs/active-futurebasic.png" alt="FutureBasic"></a><a href="../shareware/index.php"><img src="../graphics/site/tabs/shareware.png" alt="Shareware"></a><a href="../order/index.php"><img src="../graphics/site/tabs/order.png" alt="Order"></a><a href="../contact/index.php"><img src="../graphics/site/tabs/contact.png" alt="Contact"></a></td>
  219. </tr>
  220. </table>
  221. </td>
  222. </tr>
  223.  
  224. <tr>
  225. <td class="w-middle">
  226.  
  227. <table class="w-content" border="0" cellpadding="0" cellspacing="0">
  228. <tr>
  229. <td class="w-content">
  230. <h1>Tech Notes</h1><h2>STAZ Munger - The ultimate search routine</h2><p>There comes a time in every programmers life when he starts to ask questions about things. Things like: "Why am I growing hair in certain places?" and "How do I search a large handle of text?"</p>
  231.  
  232. <p>I'll do my best to deal with both of those questions here, starting with grabbing your large handle and helping you look at it. Do that now. Grab your handle. Have you given it a name? We suggest doing that. It is a good programming practice to pre-dimension all of your variables. I'll call mine 'h'. That can be short for handle. (Or hair.)</p>
  233.  
  234. <pre>
  235. dim h as handle
  236. </pre>
  237.  
  238. <p>The next step, and it is an easy one, is to put your handle into a munger. In this case, we use the stazMunger. I like it because it's fast. We're talking a search routine that can zip through hundreds of files in a tenth of a second. And what is even more important is that the search is not case sensitive! If you search for "your HAIR" it will find "your hair". (I told you at the outset that we would deal with both questions. I have now fulfilled my obligation.)</p>
  239.  
  240. <p>Without further ado, the fastest, meanest, coolest, search function to ever toggle the bits of a Macintosh computer. I give you, <i>stazMunger!</i></p>
  241.  
  242. <pre>
  243. register on
  244. local fn stazMunger(ptrIn as ptr , start as long , limit as long, @txtPtr as ^str255) 
  245. register off
  246.  dim as long p, theEnd, x, lgth, searchByte, lastByte
  247.  dim as ptr txt
  248.  lgth       = txtPtr.0`` - 1
  249.  theEnd     = ptrIn + limit - lgth
  250.  p          = ptrIn + start
  251.  txt        = txtPtr + 1
  252.  searchByte = gFBLowerChar(txt.0``)
  253.  lastByte   = gFBLowerChar(|txt + lgth|)
  254.  
  255.  while p < theend
  256.   long if gfblowerchar(|p|) == searchByte
  257.    long if gFBLowerChar(|p + lgth|) == lastByte
  258.     x  = lgth - 1
  259.     while x > 0
  260.      if gFBLowerChar(|txt + x|) != gFBLowerChar(|p + x|) then exit while
  261.       x --
  262.      wend
  263.      if x <= 0 then p -= ptrIn : exit fn      ' Found
  264.     end if
  265.    end if
  266.   p ++
  267.  wend
  268.  p  = -1                                         ' Not Found
  269. end fn = p
  270. </pre>
  271.  
  272. <p>Calling the function is not a big deal. You can grab the handle from anywhere.  In the following little function, I fill a handle with the contents of a file, then call stazMunger using the handle. Because stazMunger does not move memory, you do not need to lock the handle. My sample function reads a file given only a file spec as a parameter.</p>
  273.  
  274. <pre>
  275. local fn readTextFile(fsIn as ^fsSpec)
  276.  dim h     as handle
  277.  dim lgth  as long
  278.  dim fs    as fsSpec
  279.  
  280.  BlockMove fsIn,@fs, sizeOf(fsSpec)
  281.  
  282.  open "I",#1,@fs
  283.  lgth = lof(1,1)
  284.  
  285.  h = fn NewHandle(lgth)
  286.  long if h
  287.   HLock(h)
  288.   read file #1, [h], lgth
  289.   HUnLock(h)
  290.  end if
  291.  
  292.  close #1
  293. end fn = h
  294. </pre>
  295.  
  296. <p>The next step is to feed the handle to stazMunger and ask for a search string.</p>
  297.  
  298. <pre>
  299. dim as str255     searchFor
  300. dim as handle     h
  301. dim as long       offset , handleSize
  302.  
  303. offset     = 0
  304. handleSize = fn GetHandleSize ( h )
  305. searchFor  = "hair"
  306. offset     = fn stazMunger ( [h] , offset , handleSize , searchFor )
  307. </pre>
  308.  
  309. <p>When the job is complete, 'offset' will either equal an offet into the handle 'h' or it will equal -1 to indicate that the search string was not found. Cool, huh?</p>
  310.  
  311. <p>p.s. My thanks to Jay Reeve for his many speed-ups and improvements in this routine.</p>
  312. </td>
  313. </tr>
  314. </table>
  315.  
  316. <table class="w-sidebar" border="0" cellpadding="0" cellspacing="0">
  317. <tr>
  318. <td class="w-sidebar">
  319. <p><a href="index.php"><img src="../graphics/fb_icon.png" alt="FutureBASIC"></a></p>
  320.  
  321. <p><a href="demo.php">Demo</a></p>
  322.  
  323. <p><a href="../order/index.php">Order</a></p>
  324.  
  325. <p><a href="tour.php">Tour</a></p>
  326.  
  327. <p><a href="tech-notes.php">Tech Notes</a></p>
  328.  
  329. <p><a href="faq.php">FAQ</a></p>
  330.  
  331. <p><a href="sample-code.php">Sample Code</a></p>
  332.  
  333. <p><a href="web-sites.php">Web Sites</a></p>
  334.  
  335. <p><a href="mailing-list.php">Mailing List</a></p>
  336.  
  337. <p><a href="system-requirements.php">System<br>Requirements</a></p>
  338.  
  339. <form method="GET" action="http://www.google.com/search" style="margin: 0; padding: 0;">
  340. <p style="margin: 0; padding: 0 0 5px 0; text-align: right;"><input type="hidden" id="ie" name="ie" value=UTF-8><input type="hidden" id="oe" name="oe" value=UTF-8><input type="text" name="q" size="15" maxlength="255" value="" style="width: 155px;" class="text-box"></p>
  341. <p style="margin: 0; padding: 0; text-align: right;"><input type="submit" name="btnG" value="Search" class="push-button"><input type="hidden" name="domains" value="stazsoftware.com"><input type="hidden" name="sitesearch" value=""><input type="hidden" name="sitesearch" value="stazsoftware.com" checked></p>
  342. </form></td>
  343. </tr>
  344. </table>
  345. </td>
  346. </tr>
  347.  
  348. <tr>
  349. <td class="w-bottom"><img src="../graphics/site/blank.gif" width="2" height="2" alt="blank"></td>
  350. </tr>
  351. </table>
  352.  
  353. </body>
  354. </html>