diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2013-01-27 23:51:56 +0000 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2013-01-27 23:51:56 +0000 |
commit | 6ab0c0f5bf14ed9c15370407b9ee7e0b4b089ae1 (patch) | |
tree | 926065cf45450116098db664e3c61dced9e1f21a /ipl/packs/idol/buffer.iol | |
download | icon-upstream/9.4.3.tar.gz |
Initial upstream version 9.4.3upstream/9.4.3
Diffstat (limited to 'ipl/packs/idol/buffer.iol')
-rw-r--r-- | ipl/packs/idol/buffer.iol | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/ipl/packs/idol/buffer.iol b/ipl/packs/idol/buffer.iol new file mode 100644 index 0000000..52cb4f7 --- /dev/null +++ b/ipl/packs/idol/buffer.iol @@ -0,0 +1,132 @@ +class buffer(public filename,text,index) + # read a buffer in from a file + method read() + f := open(self.filename,"r") | fail + self$erase() + every put(self.text,!f) + close(f) + return + end + # write a buffer out to a file + method write() + f := open(self.filename,"w") | fail + every write(f,!self.text) + close(f) + end + # insert a line at the current index + method insert(s) + if self.index = 1 then { + push(self.text,s) + } else if self.index > *self.text then { + put(self.text,s) + } else { + self.text := self.text[1:self.index]|||[s]|||self.text[self.index:0] + } + self.index +:= 1 + return + end + # delete a line at the current index + method delete() + if self.index > *self.text then fail + rv := self.text[self.index] + if self.index=1 then pull(self.text) + else if self.index = *self.text then pop(self.text) + else self.text := self.text[1:self.index]|||self.text[self.index+1:0] + return rv + end + # move the current index to an arbitrary line + method goto(l) + if (1 <= l) & (l <= *self.text+1) then return self.index := l + end + # return the current line and advance the current index + method forward() + if self.index > *self.text then fail + rv := self.text[self.index] + self.index +:= 1 + return rv + end + # place the buffer's text into a contiguously allocated list + method linearize() + tmp := list(*self.text) + every i := 1 to *tmp do tmp[i] := self.text[i] + self.text := tmp + end + method erase() + self.text := [ ] + self.index := 1 + end + method size() + return *(self.text) + end +initially + if \ (self.filename) then { + if not self$read() then self$erase() + } else { + self.filename := "*scratch*" + self.erase() + } +end + + +class buftable : buffer() + method read() + self$buffer.read() + tmp := table() + every line := !self.text do + line ? { tmp[tab(many(&ucase++&lcase))] := line | fail } + self.text := tmp + return + end + method lookup(s) + return self.text[s] + end +end + + +class bibliography : buftable() +end + + +class spellChecker : buftable(parentSpellChecker) + method spell(s) + return \ (self.text[s]) | (\ (self.parentSpellChecker))$spell(s) + end +end + + +class dictentry(word,pos,etymology,definition) + method decode(s) # decode a dictionary entry into its components + s ? { + self.word := tab(upto(';')) + move(1) + self.pos := tab(upto(';')) + move(1) + self.etymology := tab(upto(';')) + move(1) + self.definition := tab(0) + } + end + method encode() # encode a dictionary entry into a string + return self.word||";"||self.pos||";"||self.etymology||";"||self.definition + end +initially + if /self.pos then { + # constructor was called with a single string argument + self$decode(self.word) + } +end + +class dictionary : buftable() + method read() + self$buffer.read() + tmp := table() + every line := !self.text do + line ? { tmp[tab(many(&ucase++&lcase))] := dictentry(line) | fail } + self.text := tmp + end + method write() + f := open(b.filename,"w") | fail + every write(f,(!self.text)$encode()) + close(f) + end +end |