picolisp

Unnamed repository; edit this file to name it for gitweb.
git clone https://logand.com/git/picolisp.git/
Log | Files | Refs | README | LICENSE

commit 96bce9d943086789a0a80bdce973ddb7a43b3e43
parent 137f217bb55e5d4199d3699326a072da594e96ed
Author: Alexander Burger <abu@software-lab.de>
Date:   Fri, 18 May 2012 11:07:14 +0200

Removed HtOK stuff from ht:Prin
Diffstat:
Msrc/ht.c | 83+++++++++++++++++++++++++------------------------------------------------------
Msrc64/ht.l | 116+++++++++++++++++++------------------------------------------------------------
2 files changed, 54 insertions(+), 145 deletions(-)

diff --git a/src/ht.c b/src/ht.c @@ -1,34 +1,9 @@ -/* 22jul11abu +/* 18may12abu * (c) Software Lab. Alexander Burger */ #include "pico.h" -static char *HtOK[] = { - "<b>", "</b>", - "<i>", "</i>", - "<u>", "</u>", - "<p>", "</p>", - "<pre>", "</pre>", - "<div ", "</div>", - "<br>", "<hr>", NULL -}; - -static bool findHtOK(char *s) { - char **p, *q, *t; - - for (p = HtOK; *p; ++p) - for (q = *p, t = s;;) { - if (*q != *t) - break; - if (*++q == '\0') - return YES; - if (*++t == '\0') - break; - } - return NO; -} - // (ht:Prin 'sym ..) -> sym any Prin(any x) { any y = Nil; @@ -38,43 +13,37 @@ any Prin(any x) { prin(y); else { int c; - char *p, *q, nm[bufSize(y)]; + char *p, nm[bufSize(y)]; bufString(y, nm); for (p = nm; *p;) { - if (findHtOK(p) && (q = strchr(p,'>'))) - do - Env.put(*p++); - while (p <= q); - else { - switch (*(byte*)p) { - case '<': - outString("&lt;"); - break; - case '>': - outString("&gt;"); - break; - case '&': - outString("&amp;"); - break; - case '"': - outString("&quot;"); - break; - case 0xFF: - Env.put(0xEF); - Env.put(0xBF); - Env.put(0xBF); - break; - default: - Env.put(c = *p); - if ((c & 0x80) != 0) { + switch (*(byte*)p) { + case '<': + outString("&lt;"); + break; + case '>': + outString("&gt;"); + break; + case '&': + outString("&amp;"); + break; + case '"': + outString("&quot;"); + break; + case 0xFF: + Env.put(0xEF); + Env.put(0xBF); + Env.put(0xBF); + break; + default: + Env.put(c = *p); + if ((c & 0x80) != 0) { + Env.put(*++p); + if ((c & 0x20) != 0) Env.put(*++p); - if ((c & 0x20) != 0) - Env.put(*++p); - } } - ++p; } + ++p; } } } diff --git a/src64/ht.l b/src64/ht.l @@ -1,27 +1,10 @@ -# 29sep11abu +# 18may12abu # (c) Software Lab. Alexander Burger (data 'HtData) initData ### Hypertext I/O functions ### -(data 'HtOK) -align 8 asciz "<b>" -align 8 asciz "</b>" -align 8 asciz "<i>" -align 8 asciz "</i>" -align 8 asciz "<u>" -align 8 asciz "</u>" -align 8 asciz "<p>" -align 8 asciz "</p>" -align 8 asciz "<pre>" -align 8 asciz "</pre>" -align 8 asciz "<div " -align 8 asciz "</div>" -align 8 asciz "<br>" -align 8 asciz "<hr>" -: HtOkEnd - : HtLt asciz "&lt;" : HtGt asciz "&gt;" : HtAmp asciz "&amp;" @@ -34,39 +17,6 @@ align 8 asciz "<hr>" (code 'HtCode) initCode -(code 'findHtOkY_FE 0) - push X - ld X HtOK - do - push X - push Y - do - ld B (X) # Compare bytes - cmp B (Y) # Equal? - while eq # Yes - inc X # End of HtOk string? - nul (X) - if z # Yes: Found - slen C Y # Length of the remaining string - ld B (char ">") # Is there a closing tag? - memb Y C - ldz E Y # Yes: Return pointer to next char in E - pop Y - pop X - pop X - ret # 'z' or 'nz' - end - inc Y # End of data? - nul (Y) - until z # Yes - pop Y - pop X - add X 8 # Try next - cmp X HtOkEnd # Done? - until gt # Yes - pop X - ret # 'nz' - # (ht:Prin 'sym ..) -> sym (code 'Prin 2) push X @@ -90,66 +40,56 @@ align 8 asciz "<hr>" do nul (Y) # Null byte? while nz # No - call findHtOkY_FE # Preserved pattern? - if z # Yes - do - ld B (Y) # Output partial string - call (PutB) - inc Y # till end pointer in E - cmp Y E - until eq + ld B (Y) # Next byte + cmp B (char "<") # Escape special characters + if eq + ld C HtLt # "&lt;" + call outStringC else - ld B (Y) # Next byte - cmp B (char "<") # Escape special characters + cmp B (char ">") if eq - ld C HtLt # "&lt;" + ld C HtGt # "&gt;" call outStringC else - cmp B (char ">") + cmp B (char "&") if eq - ld C HtGt # "&gt;" + ld C HtAmp # "&amp;" call outStringC else - cmp B (char "&") + cmp B (char "\"") if eq - ld C HtAmp # "&amp;" + ld C HtQuot # "&quot;" call outStringC else - cmp B (char "\"") + cmp B (hex "FF") if eq - ld C HtQuot # "&quot;" - call outStringC + ld B (hex "EF") + call (PutB) + ld B (hex "BF") + call (PutB) + ld B (hex "BF") + call (PutB) else - cmp B (hex "FF") - if eq - ld B (hex "EF") - call (PutB) - ld B (hex "BF") - call (PutB) - ld B (hex "BF") + ld C A # Save char + call (PutB) # Output it + test C (hex "80") # Double byte? + if nz # Yes + inc Y # Next + ld B (Y) # Output second byte call (PutB) - else - ld C A # Save char - call (PutB) # Output it - test C (hex "80") # Double byte? + test C (hex "20") # Triple byte? if nz # Yes inc Y # Next - ld B (Y) # Output second byte + ld B (Y) # Output third byte call (PutB) - test C (hex "20") # Triple byte? - if nz # Yes - inc Y # Next - ld B (Y) # Output third byte - call (PutB) - end end end end end end end - inc Y # Increment string pointer end + inc Y # Increment string pointer loop ld S Z # Drop buffer pop E