home *** CD-ROM | disk | FTP | other *** search
/ ftp.cs.arizona.edu / ftp.cs.arizona.edu.tar / ftp.cs.arizona.edu / icon / historic / v941.tgz / icon.v941src.tar / icon.v941src / ipl / packs / skeem / skstring.icn < prev    next >
Text File  |  2000-07-29  |  7KB  |  361 lines

  1. ############################################################################
  2. #
  3. #    Name:    skstring.icn
  4. #
  5. #    Title:    Scheme in Icon
  6. #
  7. #    Author: Bob Alexander
  8. #
  9. #    Date:    March 23, 1995
  10. #
  11. #    Description: see skeem.icn
  12. #
  13. ############################################################################
  14.  
  15. #
  16. # skeem -- Scheme in Icon
  17. #
  18. # String and character procedures
  19. #
  20.  
  21. #
  22. # Initialize
  23. #
  24. # List entries are described in skfun.icn.
  25. #
  26. procedure InitString()
  27.    DefFunction([
  28.       CHAR_2_INTEGER,
  29.       CHAR_ALPHABETIC_P,
  30.       CHAR_CI_EQ,"twoOrMore","CHAR-CI=?",
  31.       CHAR_CI_GE,"twoOrMore","CHAR-CI>=?",
  32.       CHAR_CI_GT,"twoOrMore","CHAR-CI>?",
  33.       CHAR_CI_LE,"twoOrMore","CHAR-CI<=?",
  34.       CHAR_CI_LT,"twoOrMore","CHAR-CI<?",
  35.       CHAR_CI_NE,"twoOrMore","CHAR-CI<>?",
  36.       CHAR_DOWNCASE,
  37.       CHAR_EQ,"twoOrMore","CHAR=?",
  38.       CHAR_GE,"twoOrMore","CHAR>=?",
  39.       CHAR_GT,"twoOrMore","CHAR>?",
  40.       CHAR_LE,"twoOrMore","CHAR<=?",
  41.       CHAR_LOWER_CASE_P,
  42.       CHAR_LT,"twoOrMore","CHAR<?",
  43.       CHAR_NE,"twoOrMore","CHAR<>?",
  44.       CHAR_NUMERIC_P,
  45.       CHAR_P,
  46.       CHAR_UPCASE,
  47.       CHAR_UPPER_CASE_P,
  48.       CHAR_WHITESPACE_P,
  49.       INTEGER_2_CHAR,
  50.       LIST_2_STRING,
  51.       MAKE_STRING,1,2,
  52.       STRING,&null,
  53.       STRING_2_EXPRESSION,
  54.       STRING_2_LIST,
  55.       STRING_APPEND,&null,
  56.       STRING_CI_EQ,"twoOrMore","STRING-CI=?",
  57.       STRING_CI_GE,"twoOrMore","STRING-CI>=?",
  58.       STRING_CI_GT,"twoOrMore","STRING-CI>?",
  59.       STRING_CI_LE,"twoOrMore","STRING-CI<=?",
  60.       STRING_CI_LT,"twoOrMore","STRING-CI<?",
  61.       STRING_CI_NE,"twoOrMore","STRING-CI<>?",
  62.       STRING_COPY,
  63.       STRING_EQ,"twoOrMore","STRING=?",
  64.       STRING_FILL_BANG,2,
  65.       STRING_GE,"twoOrMore","STRING>=?",
  66.       STRING_GT,"twoOrMore","STRING>?",
  67.       STRING_LE,"twoOrMore","STRING<=?",
  68.       STRING_LENGTH,
  69.       STRING_LT,"twoOrMore","STRING<?",
  70.       STRING_NE,"twoOrMore","STRING<>?",
  71.       STRING_P,
  72.       STRING_REF,2,
  73.       STRING_SET_BANG,3,
  74.       SUBSTRING,2,3,
  75.       SUBSTRING_COPY_BANG,3])
  76.    return
  77. end
  78.  
  79.  
  80. #
  81. # Characters
  82. #
  83.  
  84. procedure CHAR_P(x)
  85.    return (CharP(x),T) | F
  86. end
  87.  
  88. procedure CHAR_LT(c1,c2)
  89.    return STRING_LT(c1,c2)
  90. end
  91.  
  92. procedure CHAR_LE(c1,c2)
  93.    return STRING_LE(c1,c2)
  94. end
  95.  
  96. procedure CHAR_EQ(c1,c2)
  97.    return STRING_EQ(c1,c2)
  98. end
  99.  
  100. procedure CHAR_GE(c1,c2)
  101.    return STRING_GE(c1,c2)
  102. end
  103.  
  104. procedure CHAR_GT(c1,c2)
  105.    return STRING_GT(c1,c2)
  106. end
  107.  
  108. procedure CHAR_NE(c1,c2)
  109.    return STRING_NE(c1,c2)
  110. end
  111.  
  112. procedure CHAR_CI_LT(c1,c2)
  113.    return STRING_CI_LT(c1,c2)
  114. end
  115.  
  116. procedure CHAR_CI_LE(c1,c2)
  117.    return STRING_CI_LE(c1,c2)
  118. end
  119.  
  120. procedure CHAR_CI_EQ(c1,c2)
  121.    return STRING_CI_EQ(c1,c2)
  122. end
  123.  
  124. procedure CHAR_CI_GE(c1,c2)
  125.    return STRING_CI_GE(c1,c2)
  126. end
  127.  
  128. procedure CHAR_CI_GT(c1,c2)
  129.    return STRING_CI_GT(c1,c2)
  130. end
  131.  
  132. procedure CHAR_CI_NE(c1,c2)
  133.    return STRING_CI_NE(c1,c2)
  134. end
  135.  
  136. procedure CHAR_ALPHABETIC_P(c)
  137.    return (any(&letters,c.value),T) | F
  138. end
  139.  
  140. procedure CHAR_NUMERIC_P(c)
  141.    return (any(&digits,c.value),T) | F
  142. end
  143.  
  144. procedure CHAR_WHITESPACE_P(c)
  145.    return (any(' \n\f\r\l',c.value),T) | F
  146. end
  147.  
  148. procedure CHAR_UPPER_CASE_P(c)
  149.    return (any(&ucase,c.value),T) | F
  150. end
  151.  
  152. procedure CHAR_LOWER_CASE_P(c)
  153.    return (any(&lcase,c.value),T) | F
  154. end
  155.  
  156. procedure CHAR_2_INTEGER(c)
  157.    return ord(c.value)
  158. end
  159.  
  160. procedure INTEGER_2_CHAR(c)
  161.    return Char(char(c))
  162. end
  163.  
  164. procedure CHAR_UPCASE(c)
  165.    return Char(map(c.value,&lcase,&ucase))
  166. end
  167.  
  168. procedure CHAR_DOWNCASE(c)
  169.    return Char(map(c.value,&ucase,&lcase))
  170. end
  171.  
  172.  
  173. #
  174. # Strings
  175. #
  176.  
  177. procedure STRING_P(x)
  178.    return (StringP(x),T) | F
  179. end
  180.  
  181. procedure MAKE_STRING(len,c)
  182.    return String(repl((\c).value | "\0",len))
  183. end
  184.  
  185. procedure STRING(c[])
  186.    local result
  187.    result := ""
  188.    every result ||:= (!c).value
  189.    return String(result)
  190. end
  191.  
  192. procedure STRING_LENGTH(s)
  193.    return *s.value
  194. end
  195.  
  196. procedure STRING_REF(s,i)
  197.    return Char(s.value[i + 1])
  198. end
  199.  
  200. procedure STRING_SET_BANG(s,i,c)
  201.    s.value[i + 1] := c.value
  202.    return s
  203. end
  204.  
  205. invocable "<<":2
  206.  
  207. procedure STRING_LT(s[])
  208.    static op
  209.    initial op := proc("<<",2)
  210.    return StringPredicate(s,op)
  211. end
  212.  
  213. invocable "<<=":2
  214.  
  215. procedure STRING_LE(s[])
  216.    static op
  217.    initial op := proc("<<=",2)
  218.    return StringPredicate(s,op)
  219. end
  220.  
  221. invocable "==":2
  222.  
  223. procedure STRING_EQ(s[])
  224.    static op
  225.    initial op := proc("==",2)
  226.    return StringPredicate(s,op)
  227. end
  228.  
  229. invocable ">>=":2
  230.  
  231. procedure STRING_GE(s[])
  232.    static op
  233.    initial op := proc(">>=",2)
  234.    return StringPredicate(s,op)
  235. end
  236.  
  237. invocable ">>":2
  238.  
  239. procedure STRING_GT(s[])
  240.    static op
  241.    initial op := proc(">>",2)
  242.    return StringPredicate(s,op)
  243. end
  244.  
  245. invocable "~==":2
  246.  
  247. procedure STRING_NE(s[])
  248.    static op
  249.    initial op := proc("~==",2)
  250.    return StringPredicate(s,op)
  251. end
  252.  
  253. invocable "<<":2
  254.  
  255. procedure STRING_CI_LT(s[])
  256.    static op
  257.    initial op := proc("<<",2)
  258.    return StringPredicateCI(s,op)
  259. end
  260.  
  261. invocable "<<=":2
  262.  
  263. procedure STRING_CI_LE(s[])
  264.    static op
  265.    initial op := proc("<<=",2)
  266.    return StringPredicateCI(s,op)
  267. end
  268.  
  269. invocable "==":2
  270.  
  271. procedure STRING_CI_EQ(s[])
  272.    static op
  273.    initial op := proc("==",2)
  274.    return StringPredicateCI(s,op)
  275. end
  276.  
  277. invocable ">>=":2
  278.  
  279. procedure STRING_CI_GE(s[])
  280.    static op
  281.    initial op := proc(">>=",2)
  282.    return StringPredicateCI(s,op)
  283. end
  284.  
  285. invocable ">>":2
  286.  
  287. procedure STRING_CI_GT(s[])
  288.    static op
  289.    initial op := proc(">>",2)
  290.    return StringPredicateCI(s,op)
  291. end
  292.  
  293. invocable "~==":2
  294.  
  295. procedure STRING_CI_NE(s[])
  296.    static op
  297.    initial op := proc("~==",2)
  298.    return StringPredicateCI(s,op)
  299. end
  300.  
  301. procedure SUBSTRING(s,i,j)
  302.    return String(s.value[i + 1:\j + 1 | 0]) |
  303.       Error(SUBSTRING,"indices out of range")
  304. end
  305.  
  306. procedure STRING_APPEND(s[])
  307.    local result
  308.    result := get(s).value | ""
  309.    every result ||:= (!s).value
  310.    return String(result)
  311. end
  312.  
  313. procedure STRING_2_LIST(s)
  314.    local result
  315.    result := LLNull
  316.    every result := LLPair(Char(!s.value),result)
  317.    return LLInvert(result)
  318. end
  319.  
  320. procedure LIST_2_STRING(lst)
  321.    return STRING!LLToList(lst)
  322. end
  323.  
  324. procedure STRING_COPY(s)
  325.    return copy(s)
  326. end
  327.  
  328. procedure STRING_FILL_BANG(s,c)
  329.    s.value := repl(c.value,*s.value)
  330.    return s
  331. end
  332.  
  333. procedure STRING_2_EXPRESSION(s)
  334.    return StringToExpr(s.value) | F
  335. end
  336.  
  337. procedure SUBSTRING_COPY_BANG(s1,k,s2)
  338.    local s2v,copyLen
  339.    s2v := s2.value
  340.    copyLen := *s1.value - k
  341.    copyLen >:= *s2v
  342.    s1.value[k + 1+:copyLen] := s2v
  343.    return s1
  344. end
  345.  
  346. procedure StringPredicate(sList,op)
  347.    local result,x
  348.    result := get(sList).value
  349.    every x := (!sList).value do
  350.       result := op(result,x) | (if &errornumber then fail else return F)
  351.    return T
  352. end
  353.  
  354. procedure StringPredicateCI(sList,op)
  355.    local result,x
  356.    result := map(get(sList).value)
  357.    every x := map((!sList).value) do
  358.       result := op(result,x) | (if &errornumber then fail else return F)
  359.    return T
  360. end
  361.