Mirror of CollapseOS
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.3KB

  1. ( requires core, str )
  2. ( string being sent to parse routines are always null
  3. terminated )
  4. : (parsec) ( a -- n f )
  5. ( apostrophe is ASCII 39 )
  6. DUP C@ 39 = NOT IF 0 EXIT THEN ( a 0 )
  7. DUP 2 + C@ 39 = NOT IF 0 EXIT THEN ( a 0 )
  8. ( surrounded by apos, good, return )
  9. 1 + C@ 1 ( n 1 )
  10. ;
  11. ( returns negative value on error )
  12. : hexdig ( c -- n )
  13. ( '0' is ASCII 48 )
  14. 48 -
  15. DUP 0 < IF EXIT THEN ( bad )
  16. DUP 10 < IF EXIT THEN ( good )
  17. ( 'a' is ASCII 97. 59 = 97 - 48 )
  18. 49 -
  19. DUP 0 < IF EXIT THEN ( bad )
  20. DUP 6 < IF 10 + EXIT THEN ( good )
  21. ( bad )
  22. 255 -
  23. ;
  24. : (parseh) ( a -- n f )
  25. ( '0': ASCII 0x30 'x': 0x78 0x7830: 30768 )
  26. DUP @ 30768 = NOT IF 0 EXIT THEN ( a 0 )
  27. ( We have "0x" prefix )
  28. 2 +
  29. ( validate slen )
  30. DUP SLEN ( a l )
  31. DUP 0 = IF DROP 0 EXIT THEN ( a 0 )
  32. 4 > IF DROP 0 EXIT THEN ( a 0 )
  33. 0 ( a r )
  34. BEGIN
  35. OVER C@
  36. DUP 0 = IF DROP SWAP DROP 1 EXIT THEN ( r, 1 )
  37. hexdig ( a r n )
  38. DUP 0 < IF DROP DROP 1 EXIT THEN ( a 0 )
  39. SWAP 16 * + ( a r*16+n )
  40. SWAP 1 + SWAP ( a+1 r )
  41. AGAIN
  42. ;
  43. ( returns negative value on error )
  44. : bindig ( c -- n )
  45. ( '0' is ASCII 48 )
  46. 48 -
  47. DUP 0 < IF EXIT THEN ( bad )
  48. DUP 2 < IF EXIT THEN ( good )
  49. ( bad )
  50. 255 -
  51. ;
  52. : (parseb) ( a -- n f )
  53. ( '0': ASCII 0x30 'b': 0x62 0x6230: 25136 )
  54. DUP @ 25136 = NOT IF 0 EXIT THEN ( a 0 )
  55. ( We have "0b" prefix )
  56. 2 +
  57. ( validate slen )
  58. DUP SLEN ( a l )
  59. DUP 0 = IF DROP 0 EXIT THEN ( a 0 )
  60. 16 > IF DROP 0 EXIT THEN ( a 0 )
  61. 0 ( a r )
  62. BEGIN
  63. OVER C@
  64. DUP 0 = IF DROP SWAP DROP 1 EXIT THEN ( r, 1 )
  65. bindig ( a r n )
  66. DUP 0 < IF DROP DROP 1 EXIT THEN ( a 0 )
  67. SWAP 2 * + ( a r*2+n )
  68. SWAP 1 + SWAP ( a+1 r )
  69. AGAIN
  70. ;
  71. : (parse) ( a -- n )
  72. (parsec) IF EXIT THEN
  73. (parseh) IF EXIT THEN
  74. (parseb) IF EXIT THEN
  75. (parsed) IF EXIT THEN
  76. ( nothing works )
  77. ABORT" unknown word! "
  78. ;
  79. ' (parse) (parse*) !