index.html 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html><head>
  3. <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
  4. <title>GNU Make Standard Library</title></head>
  5. <body>
  6. <h1>GNU Make Standard Library</h1>
  7. The GNU Make Standard Library (GMSL) is a collection of functions
  8. implemented using native GNU Make functionality that provide list and
  9. string manipulation, integer arithmetic, associative arrays, stacks,
  10. and debugging facilities.&nbsp; The GMSL is released under the BSD License.<br>
  11. <br>
  12. <a href="http://sourceforge.net/projects/gmsl/">[Project Page]</a> <a href="http://sourceforge.net/project/showfiles.php?group_id=129887">[Download]</a>
  13. <a href="http://sourceforge.net/forum/forum.php?forum_id=443916">[Discussion
  14. Forum]</a><br>
  15. <h2>Using GMSL</h2>
  16. The two files needed are <span style="font-family: monospace;">gmsl</span>
  17. and <span style="font-family: monospace;">__gmsl</span>.&nbsp; To
  18. include the GMSL in your Makefile do<br>
  19. <pre style="margin-left: 40px;">include gmsl</pre>
  20. <span style="font-family: monospace;">gmsl</span> automatically includes<span style="font-family: monospace;"> __gmsl</span>.&nbsp; To check that
  21. you have the right version of <span style="font-family: monospace;">gmsl</span>
  22. use the <span style="font-family: monospace;">gmsl_compatible</span>
  23. function (see
  24. below). The current version is <span style="font-family: monospace;">1 1 6</span>.<br>
  25. <br>
  26. The GMSL package also includes a test suite for GMSL.&nbsp; Just run <span style="font-family: monospace;">make -f gmsl-tests</span>.<br>
  27. <h2>Logical Operators</h2>GMSL has boolean $(true) (a non-empty string)
  28. and $(false) (an empty string).&nbsp; The following operators can be
  29. used with those variables.<br>
  30. <br>
  31. <hr style="width: 100%; height: 2px;"><span style="font-weight: bold;">not</span><br>
  32. <br>
  33. <span style="font-family: monospace;">Arguments: A boolean value</span><br style="font-family: monospace;">
  34. <span style="font-family: monospace;">Returns:&nbsp;&nbsp; Returns $(true) if the boolean is $(false) and vice versa</span><br style="font-family: monospace;">
  35. <hr style="width: 100%; height: 2px; font-family: monospace;"><span style="font-weight: bold;"></span><span style="font-weight: bold;">and</span><br>
  36. <br>
  37. <span style="font-family: monospace;">Arguments: Two boolean values</span><br style="font-family: monospace;">
  38. <span style="font-family: monospace;">Returns:&nbsp;&nbsp; Returns $(true) if both of the booleans are true</span><br style="font-family: monospace;">
  39. <hr style="width: 100%; height: 2px; font-family: monospace;"><span style="font-weight: bold;">or</span><br>
  40. <br>
  41. <span style="font-family: monospace;">Arguments: Two boolean values</span><br style="font-family: monospace;">
  42. <span style="font-family: monospace;">Returns:&nbsp;&nbsp; Returns $(true) if either of the booleans is true</span><br style="font-family: monospace;">
  43. <hr style="width: 100%; height: 2px; font-family: monospace;"><span style="font-weight: bold;">xor</span><br style="font-weight: bold;">
  44. <br>
  45. <span style="font-family: monospace;">Arguments: Two boolean values</span><br style="font-family: monospace;">
  46. <span style="font-family: monospace;">Returns:&nbsp;&nbsp; Returns $(true) if exactly one of the booleans is true</span><br style="font-family: monospace;">
  47. <hr style="width: 100%; height: 2px; font-family: monospace;"><span style="font-weight: bold;">nand</span><br>
  48. <br>
  49. <span style="font-family: monospace;">Arguments: Two boolean values</span><br style="font-family: monospace;">
  50. <span style="font-family: monospace;">Returns:&nbsp;&nbsp; Returns value of 'not and'</span><br style="font-family: monospace;">
  51. <hr style="width: 100%; height: 2px; font-family: monospace;"><span style="font-weight: bold;">nor</span><br>
  52. <br>
  53. <span style="font-family: monospace;">Arguments: Two boolean values</span><br style="font-family: monospace;">
  54. <span style="font-family: monospace;">Returns:&nbsp;&nbsp; Returns value of 'not or'</span><br style="font-family: monospace;">
  55. <hr style="width: 100%; height: 2px; font-family: monospace;"><span style="font-weight: bold;">xnor</span><br>
  56. <br>
  57. <span style="font-family: monospace;">Arguments: Two boolean values</span><br style="font-family: monospace;">
  58. <span style="font-family: monospace;">Returns:&nbsp;&nbsp; Returns value of 'not xor'</span><br style="font-family: monospace;">
  59. <hr style="width: 100%; height: 2px; font-family: monospace;">
  60. <h2>List Manipulation Functions</h2>
  61. &nbsp;A list is a string of characters; the list separator is a space.<br>
  62. <br>
  63. <hr style="width: 100%; height: 2px;"><b>first</b><br>
  64. <br>
  65. <span style="font-family: monospace;">Arguments: 1: A list<br>
  66. Returns:&nbsp;&nbsp;&nbsp;Returns the first element of a list<br>
  67. </span>
  68. <hr><b>last</b><br>
  69. <br>
  70. <span style="font-family: monospace;">Arguments: 1: A list<br>
  71. Returns:&nbsp;&nbsp;&nbsp;Returns the last element of a list<br>
  72. </span>
  73. <hr><b>rest</b><br>
  74. <br>
  75. <span style="font-family: monospace;">Arguments: 1: A list<br>
  76. Returns:&nbsp;&nbsp;&nbsp;Returns the list with the first element
  77. removed<br>
  78. </span>
  79. <hr><b>chop</b><br>
  80. <br>
  81. <span style="font-family: monospace;">Arguments: 1: A list<br>
  82. Returns:&nbsp;&nbsp;&nbsp;Returns the list with the last element removed<br>
  83. </span>
  84. <hr><b>map</b><br>
  85. <br>
  86. <span style="font-family: monospace;">Arguments: 1: Name of function to
  87. $(call) for each element of list<br>
  88. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: List to
  89. iterate over calling the function in 1<br>
  90. Returns:&nbsp;&nbsp;&nbsp;The list after calling the function on each
  91. element<br>
  92. </span>
  93. <hr><b>pairmap</b><br>
  94. <br>
  95. <span style="font-family: monospace;">Arguments: 1: Name of function to
  96. $(call) for each pair of elements<br>
  97. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: List to
  98. iterate over calling the function in 1<br>
  99. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3: Second
  100. list to iterate over calling the function in 1<br>
  101. Returns:&nbsp;&nbsp;&nbsp;The list after calling the function on each
  102. pair of elements<br>
  103. </span>
  104. <hr><b>leq</b><br>
  105. <br>
  106. <span style="font-family: monospace;">Arguments: 1: A list to compare
  107. against...<br>
  108. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: ...this
  109. list<br>
  110. Returns:&nbsp;&nbsp;&nbsp;Returns $(true) if the two lists are identical<br>
  111. </span>
  112. <hr><b>lne</b><br>
  113. <br>
  114. <span style="font-family: monospace;">Arguments: 1: A list to compare
  115. against...<br>
  116. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: ...this
  117. list<br>
  118. Returns:&nbsp;&nbsp;&nbsp;Returns $(true) if the two lists are different<br>
  119. </span>
  120. <hr><b>reverse</b><br>
  121. <br>
  122. <span style="font-family: monospace;">Arguments: 1: A list to reverse<br>
  123. Returns:&nbsp;&nbsp;&nbsp;The list with its elements in reverse order<br>
  124. </span>
  125. <hr><b>uniq</b><br>
  126. <br>
  127. <span style="font-family: monospace;">Arguments: 1: A list to deduplicate<br>
  128. Returns:&nbsp;&nbsp;&nbsp;The list with elements in order without duplicates<br>
  129. </span>
  130. <hr><b>length</b><br>
  131. <br>
  132. <span style="font-family: monospace;">Arguments: 1: A list<br>
  133. Returns:&nbsp;&nbsp;&nbsp;The number of elements in the list<br>
  134. </span>
  135. <hr style="width: 100%; height: 2px;"><span style="font-family: monospace;"></span>
  136. <h2>String Manipulation Functions</h2>
  137. A string is any sequence of characters.<br>
  138. <br>
  139. <hr style="width: 100%; height: 2px;"><b>seq</b><br>
  140. <br>
  141. <span style="font-family: monospace;">Arguments: 1: A string to compare
  142. against...<br>
  143. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: ...this
  144. string<br>
  145. Returns:&nbsp;&nbsp;&nbsp;Returns $(true) if the two strings are
  146. identical<br>
  147. </span>
  148. <hr><b>sne</b><br>
  149. <br>
  150. <span style="font-family: monospace;">Arguments: 1: A string to compare
  151. against...<br>
  152. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: ...this
  153. string<br>
  154. Returns:&nbsp;&nbsp;&nbsp;Returns $(true) if the two strings are not
  155. the same<br>
  156. </span>
  157. <hr><b>strlen</b><br>
  158. <br>
  159. <span style="font-family: monospace;">Arguments: 1: A string<br>
  160. Returns:&nbsp;&nbsp;&nbsp;Returns the length of the string<br>
  161. </span>
  162. <hr><b>substr</b><br>
  163. <br>
  164. <span style="font-family: monospace;">Arguments: 1: A string<br>
  165. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: Start offset (first character is 1)<br>
  166. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3: Ending offset (inclusive)<br>Returns:&nbsp;&nbsp;&nbsp;Returns a substring<br>
  167. </span>
  168. <hr><b>split</b><br>
  169. <br>
  170. <span style="font-family: monospace;">Arguments: 1: The character to
  171. split on<br>
  172. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: A
  173. string to split<br>
  174. Returns:&nbsp;&nbsp;&nbsp;Splits a string into a list separated by
  175. spaces at the split<br>
  176. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; character
  177. in the first argument<br>
  178. </span>
  179. <hr><b>merge</b><br>
  180. <br>
  181. <span style="font-family: monospace;">Arguments: 1: The character to
  182. put between fields<br>
  183. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: A list
  184. to merge into a string<br>
  185. Returns:&nbsp;&nbsp;&nbsp;Merges a list into a single string, list
  186. elements are separated<br>
  187. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; by the
  188. character in the first argument<br>
  189. </span>
  190. <hr><b>tr</b><br>
  191. <br>
  192. <span style="font-family: monospace;">Arguments: 1: The list of
  193. characters to translate from <br>
  194. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: The
  195. list of characters to translate to<br>
  196. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3: The
  197. text to translate<br>
  198. Returns:&nbsp;&nbsp;&nbsp;Returns the text after translating characters<br>
  199. </span>
  200. <hr><b>uc</b><br>
  201. <br>
  202. <span style="font-family: monospace;">Arguments: 1: Text to upper case<br>
  203. Returns:&nbsp;&nbsp;&nbsp;Returns the text in upper case<br>
  204. </span>
  205. <hr><b>lc</b><br>
  206. <br>
  207. <span style="font-family: monospace;">Arguments: 1: Text to lower case<br>
  208. Returns:&nbsp;&nbsp;&nbsp;Returns the text in lower case<br>
  209. </span>
  210. <hr style="width: 100%; height: 2px;"><span style="font-family: monospace;"></span>
  211. <h2>Set Manipulation Functions</h2>
  212. Sets are represented by sorted, deduplicated lists. To create a set
  213. from a list use <span style="font-family:
  214. monospace;">set_create</span>, or start with the <span
  215. style="font-family: monospace;">empty_set</span> and <span
  216. style="font-family: monospace;">set_insert</span> individual elements.
  217. The empty set is defined as <span style="font-family:
  218. monospace;">empty_set</span>.<p>
  219. <hr><b>set_create</b><br>
  220. <br>
  221. <span style="font-family: monospace;">Arguments: 1: A list of set elements<br>
  222. Returns:&nbsp;&nbsp;&nbsp;Returns the newly created set<br>
  223. </span>
  224. <hr><b>set_insert</b><br>
  225. <br>
  226. <span style="font-family: monospace;">Arguments: 1: A single element to add to a set<br>
  227. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2: A set<br>
  228. Returns:&nbsp;&nbsp;&nbsp;Returns the set with the element added<br>
  229. </span>
  230. <hr><b>set_remove</b><br>
  231. <br>
  232. <span style="font-family: monospace;">Arguments: 1: A single element to remove from a set<br>
  233. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2: A set<br>
  234. Returns:&nbsp;&nbsp;&nbsp;Returns the set with the element removed<br>
  235. </span>
  236. <hr><b>set_is_member</b><br>
  237. <br>
  238. <span style="font-family: monospace;">Arguments: 1: A single element<br>
  239. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2: A set<br>
  240. Returns:&nbsp;&nbsp;&nbsp;Returns $(true) if the element is in the set<br>
  241. </span>
  242. <hr><b>set_is_not_member</b><br>
  243. <br>
  244. <span style="font-family: monospace;">Arguments: 1: A single element<br>
  245. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2: A set<br>
  246. Returns:&nbsp;&nbsp;&nbsp;Returns $(false) if the element is in the set<br>
  247. </span>
  248. <hr><b>set_union</b><br>
  249. <br>
  250. <span style="font-family: monospace;">Arguments: 1: A set<br>
  251. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2: Another set<br>
  252. Returns:&nbsp;&nbsp;&nbsp;Returns the union of the two sets<br>
  253. </span>
  254. <hr><b>set_intersection</b><br>
  255. <br>
  256. <span style="font-family: monospace;">Arguments: 1: A set<br>
  257. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2: Another set<br>
  258. Returns:&nbsp;&nbsp;&nbsp;Returns the intersection of the two sets<br>
  259. </span>
  260. <hr><b>set_is_subset</b><br>
  261. <br>
  262. <span style="font-family: monospace;">Arguments: 1: A set<br>
  263. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2: Another set<br>
  264. Returns:&nbsp;&nbsp;&nbsp;Returns $(true) if the first set is a subset of the second<br>
  265. </span>
  266. <hr><b>set_equal</b><br>
  267. <br>
  268. <span style="font-family: monospace;">Arguments: 1: A set<br>
  269. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2: Another set<br>
  270. Returns:&nbsp;&nbsp;&nbsp;Returns $(true) if the two sets are identical<br>
  271. </span>
  272. <hr style="width: 100%; height: 2px;"><span style="font-family: monospace;"></span>
  273. <h2>Integer Arithmetic Functions</h2>
  274. Integers are represented by lists with the equivalent number of
  275. x's.&nbsp; For example the number 4 is x x x x.&nbsp; The maximum
  276. integer that the library can handle as <span style="font-style: italic;">input</span> (i.e. as the argument to a
  277. call to <span style="font-family: monospace;">int_encode</span>) is
  278. 65536. There is no limit on integer size for internal computations or
  279. output.<br>
  280. <br>
  281. The arithmetic library functions come in two forms: one form of each
  282. function takes integers as arguments and the other form takes the
  283. encoded form (x's created by a call to <span style="font-family: monospace;">int_encode</span>).&nbsp; For example,
  284. there are two plus functions: <span style="font-family: monospace;">plus</span>
  285. (called with integer arguments and returns an integer) and <span style="font-family: monospace;">int_plus</span> (called with encoded
  286. arguments and returns an encoded result).<br>
  287. <br>
  288. <span style="font-family: monospace;">plus</span> will be slower than <span style="font-family: monospace;">int_plus</span> because its arguments
  289. and result have to be translated between the x's format and
  290. integers.&nbsp; If doing a complex calculation use the <span style="font-family: monospace;">int_*</span> forms with a single
  291. encoding of inputs and single decoding of the output.&nbsp; For simple
  292. calculations the direct forms can be used.<br>
  293. <br>
  294. <hr style="width: 100%; height: 2px;"><b>int_decode</b><br>
  295. <br>
  296. <span style="font-family: monospace;">Arguments: 1: A number of x's
  297. representation<br>
  298. Returns:&nbsp;&nbsp;&nbsp;Returns the integer for human consumption
  299. that is represented<br>
  300. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; by the
  301. string of x's<br>
  302. </span>
  303. <hr><b>int_encode</b><br>
  304. <br>
  305. <span style="font-family: monospace;">Arguments: 1: A number in
  306. human-readable integer form<br>
  307. Returns:&nbsp;&nbsp;&nbsp;Returns the integer encoded as a string of x's<br>
  308. </span>
  309. <hr><b>int_plus</b><br>
  310. <br>
  311. <span style="font-family: monospace;">Arguments: 1: A number in x's
  312. representation<br>
  313. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: Another
  314. number in x's represntation<br>
  315. Returns:&nbsp;&nbsp;&nbsp;Returns the sum of the two numbers in x's
  316. representation<br>
  317. </span>
  318. <hr><b>plus (wrapped version of int_plus)</b><br>
  319. <br>
  320. <span style="font-family: monospace;">Arguments: 1: An integer<br>
  321. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: Another
  322. integer<br>
  323. Returns:&nbsp;&nbsp;&nbsp;Returns the sum of the two integers<br>
  324. </span>
  325. <hr><b>int_subtract</b><br>
  326. <br>
  327. <span style="font-family: monospace;">Arguments: 1: A number in x's
  328. representation<br>
  329. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: Another
  330. number in x's represntation<br>
  331. Returns:&nbsp;&nbsp;&nbsp;Returns the difference of the two numbers in
  332. x's representation,<br>
  333. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or outputs
  334. an error on a numeric underflow<br>
  335. </span>
  336. <hr><b>subtract (wrapped version of int_subtract)</b><br>
  337. <br>
  338. <span style="font-family: monospace;">Arguments: 1: An integer<br>
  339. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: Another
  340. integer<br>
  341. Returns:&nbsp;&nbsp;&nbsp;Returns the difference of the two integers,<br>
  342. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or outputs
  343. an error on a numeric underflow<br>
  344. </span>
  345. <hr><b>int_multiply</b><br>
  346. <br>
  347. <span style="font-family: monospace;">Arguments: 1: A number in x's
  348. representation<br>
  349. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: Another
  350. number in x's represntation<br>
  351. Returns:&nbsp;&nbsp;&nbsp;Returns the product of the two numbers in x's
  352. representation<br>
  353. </span>
  354. <hr><b>multiply (wrapped version of int_multiply)</b><br>
  355. <br>
  356. <span style="font-family: monospace;">Arguments: 1: An integer<br>
  357. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: Another
  358. integer<br>
  359. Returns:&nbsp;&nbsp;&nbsp;Returns the product of the two integers<br>
  360. </span>
  361. <hr><b>int_divide</b><br>
  362. <br>
  363. <span style="font-family: monospace;">Arguments: 1: A number in x's
  364. representation<br>
  365. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: Another
  366. number in x's represntation<br>
  367. Returns:&nbsp;&nbsp;&nbsp;Returns the result of integer division of
  368. argument 1 divided<br>
  369. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; by
  370. argument 2 in x's representation<br>
  371. </span>
  372. <hr><b>divide (wrapped version of int_divide)</b><br>
  373. <br>
  374. <span style="font-family: monospace;">Arguments: 1: An integer<br>
  375. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: Another
  376. integer<br>
  377. Returns:&nbsp;&nbsp;&nbsp;Returns the integer division of the first
  378. argument by the second<br>
  379. </span>
  380. <hr><b>int_modulo</b><br>
  381. <br>
  382. <span style="font-family: monospace;">Arguments: 1: A number in x's
  383. representation<br>
  384. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: Another
  385. number in x's represntation<br>
  386. Returns:&nbsp;&nbsp;&nbsp;Returns the remainder of integer division of
  387. argument 1 divided<br>
  388. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; by
  389. argument 2 in x's representation<br>
  390. </span>
  391. <hr><b>modulo (wrapped version of int_modulo)</b><br>
  392. <br>
  393. <span style="font-family: monospace;">Arguments: 1: An integer<br>
  394. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: Another
  395. integer<br>
  396. Returns:&nbsp;&nbsp;&nbsp;Returns the remainder of integer division of the first
  397. argument by the second<br>
  398. </span>
  399. <hr><b>int_max, int_min</b><br>
  400. <br>
  401. <span style="font-family: monospace;">Arguments: 1: A number in x's
  402. representation<br>
  403. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: Another
  404. number in x's represntation<br>
  405. Returns:&nbsp;&nbsp;&nbsp;Returns the maximum or minimum of its
  406. arguments in x's<br>
  407. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  408. representation<br>
  409. </span>
  410. <hr><b>max, min</b><br>
  411. <br>
  412. <span style="font-family: monospace;">Arguments: 1: An integer<br>
  413. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: Another
  414. integer<br>
  415. Returns:&nbsp;&nbsp;&nbsp;Returns the maximum or minimum of its integer
  416. arguments<br>
  417. </span>
  418. <hr><b>int_gt, int_gte, int_lt, int_lte, int_eq, int_ne</b><br>
  419. <br>
  420. <span style="font-family: monospace;">Arguments: Two x's representation
  421. numbers to be compared<br>
  422. Returns:&nbsp;&nbsp;&nbsp;$(true) or $(false)<br>
  423. <br>
  424. int_gt First argument greater than second argument<br>
  425. int_gte First argument greater than or equal to second argument<br>
  426. int_lt First argument less than second argument <br>
  427. int_lte First argument less than or equal to second argument<br>
  428. int_eq First argument is numerically equal to the second argument<br>
  429. int_ne First argument is not numerically equal to the second argument<br>
  430. </span>
  431. <hr><b>gt, gte, lt, lte, eq, ne</b><br>
  432. <br>
  433. <span style="font-family: monospace;">Arguments: Two integers to be
  434. compared<br>
  435. Returns:&nbsp;&nbsp;&nbsp;$(true) or $(false)<br>
  436. <br>
  437. gt First argument greater than second argument<br>
  438. gte First argument greater than or equal to second argument<br>
  439. lt First argument less than second argument <br>
  440. lte First argument less than or equal to second argument<br>
  441. eq First argument is numerically equal to the second argument<br>
  442. ne First argument is not numerically equal to the second argument<br>
  443. </span>
  444. increment adds 1 to its argument, decrement subtracts 1. Note that<br>
  445. decrement does not range check and hence will not underflow, but<br>
  446. will incorrectly say that 0 - 1 = 0<br>
  447. <hr><b>int_inc</b><br>
  448. <br>
  449. <span style="font-family: monospace;">Arguments: 1: A number in x's
  450. representation<br>
  451. Returns:&nbsp;&nbsp;&nbsp;The number incremented by 1 in x's
  452. representation<br>
  453. </span>
  454. <hr><b>inc</b><br>
  455. <br>
  456. <span style="font-family: monospace;">Arguments: 1: An integer<br>
  457. Returns:&nbsp;&nbsp;&nbsp;The argument incremented by 1<br>
  458. </span>
  459. <hr><b>int_dec</b><br>
  460. <br>
  461. <span style="font-family: monospace;">Arguments: 1: A number in x's
  462. representation<br>
  463. Returns:&nbsp;&nbsp;&nbsp;The number decremented by 1 in x's
  464. representation<br>
  465. </span>
  466. <hr><b>dec</b><br>
  467. <br>
  468. <span style="font-family: monospace;">Arguments: 1: An integer<br>
  469. Returns:&nbsp;&nbsp;&nbsp;The argument decremented by 1<br>
  470. </span>
  471. <hr><b>int_double</b><br>
  472. <br>
  473. <span style="font-family: monospace;">Arguments: 1: A number in x's
  474. representation<br>
  475. Returns:&nbsp;&nbsp;&nbsp;The number doubled (i.e. * 2) and returned in
  476. x's representation<br>
  477. </span>
  478. <hr><b>double</b><br>
  479. <br>
  480. <span style="font-family: monospace;">Arguments: 1: An integer<br>
  481. Returns:&nbsp;&nbsp;&nbsp;The integer times 2<br>
  482. </span>
  483. <hr><b>int_halve</b><br>
  484. <br>
  485. <span style="font-family: monospace;">Arguments: 1: A number in x's
  486. representation<br>
  487. Returns:&nbsp;&nbsp;&nbsp;The number halved (i.e. / 2) and returned in
  488. x's representation<br>
  489. </span>
  490. <hr><b>halve</b><br>
  491. <br>
  492. <span style="font-family: monospace;">Arguments: 1: An integer<br>
  493. Returns:&nbsp;&nbsp;&nbsp;The integer divided by 2<br>
  494. </span>
  495. <hr><b>sequence</b><br>
  496. <br>
  497. <span style="font-family: monospace;">Arguments: 1: An integer<br>
  498. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: An integer<br>
  499. Returns:&nbsp;&nbsp;&nbsp;The sequence [arg1 arg2] if arg1 >= arg2 or [arg2 arg1] if arg2 > arg1<br>
  500. </span>
  501. <hr><b>dec2hex, dec2bin, dec2oct</b><br>
  502. <br>
  503. <span style="font-family: monospace;">Arguments: 1: An integer<br>
  504. Returns:&nbsp;&nbsp;&nbsp;The decimal argument converted to hexadecimal, binary or octal<br>
  505. </span>
  506. <hr style="width: 100%; height: 2px;"><span style="font-family: monospace;"></span>
  507. <h2>Associative Arrays</h2>
  508. An associate array maps a key value (a string with no spaces in it) to
  509. a single value (any string).&nbsp;&nbsp;&nbsp; <br>
  510. <b><br>
  511. </b>
  512. <hr style="width: 100%; height: 2px;"><b>set</b><br>
  513. <br>
  514. <span style="font-family: monospace;">Arguments: 1: Name of associative
  515. array<br>
  516. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: The key
  517. value to associate<br>
  518. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3: The
  519. value associated with the key<br>
  520. Returns:&nbsp;&nbsp;&nbsp;Nothing<br>
  521. </span>
  522. <hr><b>get</b><br>
  523. <br>
  524. <span style="font-family: monospace;">Arguments: 1: Name of associative
  525. array<br>
  526. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: The key
  527. to retrieve<br>
  528. Returns:&nbsp;&nbsp;&nbsp;The value stored in the array for that key<br>
  529. </span>
  530. <hr><b>keys</b><br>
  531. <br>
  532. <span style="font-family: monospace;">Arguments: 1: Name of associative
  533. array<br>
  534. Returns:&nbsp;&nbsp;&nbsp;Returns a list of all defined keys in the
  535. array<br>
  536. </span>
  537. <hr><b>defined</b><br>
  538. <br>
  539. <span style="font-family: monospace;">Arguments: 1: Name of associative
  540. array<br>
  541. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: The key
  542. to test<br>
  543. Returns:&nbsp;&nbsp;&nbsp;Returns true if the key is defined (i.e. not
  544. empty)<br>
  545. </span>
  546. <hr style="width: 100%; height: 2px;"><span style="font-family: monospace;"></span>
  547. <h2>Named Stacks</h2>
  548. A stack is an ordered list of strings (with no spaces in them).<br>
  549. <br>
  550. <hr style="width: 100%; height: 2px;"><b>push</b><br>
  551. <br>
  552. <span style="font-family: monospace;">Arguments: 1: Name of stack<br>
  553. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: Value
  554. to push onto the top of the stack (must not contain<br>
  555. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a space)<br>
  556. Returns:&nbsp;&nbsp;&nbsp;None<br>
  557. </span>
  558. <hr><b>pop</b><br>
  559. <br>
  560. <span style="font-family: monospace;">Arguments: 1: Name of stack<br>
  561. Returns:&nbsp;&nbsp;&nbsp;Top element from the stack after removing it<br>
  562. </span>
  563. <hr><b>peek</b><br>
  564. <br>
  565. <span style="font-family: monospace;">Arguments: 1: Name of stack<br>
  566. Returns:&nbsp;&nbsp;&nbsp;Top element from the stack without removing it<br>
  567. </span>
  568. <hr><b>depth</b><br>
  569. <br>
  570. <span style="font-family: monospace;">Arguments: 1: Name of stack<br>
  571. Returns:&nbsp;&nbsp;&nbsp;Number of items on the stack<br>
  572. </span>
  573. <hr style="width: 100%; height: 2px;"><span style="font-family: monospace;"></span>
  574. <h2>Function memoization</h2>
  575. To reduce the number of calls to slow functions (such as $(shell) a single memoization function is provided.<br>
  576. <br>
  577. <hr style="width: 100%; height: 2px;"><b>memoize</b><br>
  578. <br>
  579. <span style="font-family: monospace;">Arguments: 1: Name of function to memoize<br>
  580. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: String argument for the function<br>
  581. Returns:&nbsp;&nbsp;&nbsp;Result of $1 applied to $2 but only calls $1 once for each unique $2<br>
  582. </span>
  583. <hr style="width: 100%; height: 2px;"><span style="font-family: monospace;"></span>
  584. <h2>Miscellaneous and Debugging Facilities</h2>
  585. GMSL defines the following constants; all are accessed as normal GNU
  586. Make variables by wrapping them in <span style="font-family: monospace;">$()</span> or <span style="font-family: monospace;">${}</span>.<br>
  587. <br>
  588. <table style="text-align: left;" border="1" cellpadding="2" cellspacing="2">
  589. <tbody>
  590. <tr>
  591. <td><span style="font-style: italic;">Constant</span><br>
  592. </td>
  593. <td><span style="font-style: italic;">Value</span><br>
  594. </td>
  595. <td><span style="font-style: italic;">Purpose</span><br>
  596. </td>
  597. </tr>
  598. <tr>
  599. <td><span style="font-family: monospace;">true</span><br>
  600. </td>
  601. <td><span style="font-family: monospace;">T</span><br>
  602. </td>
  603. <td>Boolean for <span style="font-family: monospace;">$(if)</span>
  604. and return from&nbsp; GMSL functions<br>
  605. </td>
  606. </tr>
  607. <tr>
  608. <td><span style="font-family: monospace;">false</span><br>
  609. </td>
  610. <td><br>
  611. </td>
  612. <td>Boolean for <span style="font-family: monospace;">$(if)</span>
  613. and return from GMSL functions<br>
  614. </td>
  615. </tr>
  616. <tr>
  617. <td><span style="font-family: monospace;">gmsl_version</span><br>
  618. </td>
  619. <td><span style="font-family: monospace;">1 0 0</span><br>
  620. </td>
  621. <td>GMSL version number as list: major minor revision<br>
  622. </td>
  623. </tr>
  624. </tbody>
  625. </table>
  626. <span style="font-weight: bold;"><br>
  627. gmsl_compatible</span><span style="font-family: monospace;"><br>
  628. <br>
  629. Arguments: List containing the desired library version number (maj min
  630. rev)<br>
  631. </span><span style="font-family: monospace;">Returns:&nbsp;&nbsp;
  632. $(true) if this version of the library is compatible<br>
  633. </span><span style="font-family: monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  634. with the requested version number, otherwise $(false)</span>
  635. <hr><b>gmsl-print-% (target not a function)</b><br>
  636. <br>
  637. <span style="font-family: monospace;">Arguments: The % should be
  638. replaced by the name of a variable that you<br>
  639. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wish to
  640. print out.<br>
  641. Action:&nbsp;&nbsp;&nbsp; Echos the name of the variable that matches
  642. the % and its value.<br>
  643. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For
  644. example, 'make gmsl-print-SHELL' will output the value of<br>
  645. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the SHELL
  646. variable<br>
  647. </span>
  648. <hr><b>assert</b><br>
  649. <br>
  650. <span style="font-family: monospace;">Arguments: 1: A boolean that must
  651. be true or the assertion will fail<br>
  652. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2: The
  653. message to print with the assertion<br>
  654. Returns:&nbsp;&nbsp;&nbsp;None<br>
  655. </span>
  656. <hr><b>assert_exists</b><br>
  657. <br>
  658. <span style="font-family: monospace;">Arguments: 1: Name of file that
  659. must exist, if it is missing an assertion<br>
  660. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; will be
  661. generated<br>
  662. Returns:&nbsp;&nbsp;&nbsp;None<br>
  663. </span>
  664. <hr style="width: 100%; height: 2px;"><br>
  665. GMSL has a number of environment variables (or command-line overrides)
  666. that control various bits of functionality:<br>
  667. <br>
  668. <table style="text-align: left;" border="1" cellpadding="2" cellspacing="2">
  669. <tbody>
  670. <tr>
  671. <td><span style="font-style: italic;">Variable</span><br>
  672. </td>
  673. <td><span style="font-style: italic;">Purpose</span><br>
  674. </td>
  675. </tr>
  676. <tr>
  677. <td><span style="font-family: monospace;">GMSL_NO_WARNINGS</span><br>
  678. </td>
  679. <td>If set prevents GMSL from outputting warning messages:
  680. artithmetic functions generate underflow warnings.<br>
  681. </td>
  682. </tr>
  683. <tr>
  684. <td><span style="font-family: monospace;">GMSL_NO_ERRORS</span><br>
  685. </td>
  686. <td>If set prevents GMSL from generating fatal errors: division
  687. by zero or failed assertions are fatal.<br>
  688. </td>
  689. </tr>
  690. <tr>
  691. <td><span style="font-family: monospace;">GMSL_TRACE</span><br>
  692. </td>
  693. <td>Enables function tracing.&nbsp; Calls to GMSL functions will
  694. result in name and arguments being traced.<br>
  695. </td>
  696. </tr>
  697. </tbody>
  698. </table>
  699. <span style="font-family: monospace;"></span><br>
  700. <hr>
  701. Copyright (c) 2005-2018 <a href="http://www.jgc.org/">John Graham-Cumming</a>.<br>
  702. <hr style="width: 100%; height: 2px;">
  703. <table style="width: 100%; text-align: left;" border="0" cellpadding="2" cellspacing="2">
  704. <tbody>
  705. <tr>
  706. <td style="width: 50%;">John Graham-Cumming's work on this
  707. project was sponsored by <a href="http://www.electric-cloud.com/">Electric
  708. Cloud, Inc</a>.<br>
  709. <a href="http://www.electric-cloud.com/"><img alt="" src="http://gmsl.sf.net/ec_logo.gif" style="border: 0px solid ; width: 223px; height: 47px;"></a><br>
  710. </td>
  711. <td align="right">
  712. <p><a href="http://sourceforge.net/"><img src="http://sourceforge.net/sflogo.php?group_id=129887&amp;type=1" alt="SourceForge.net Logo" border="0" height="31" width="88"></a></p>
  713. </td>
  714. </tr>
  715. </tbody>
  716. </table>
  717. </body></html>