Made weird string detection more reliable
This commit is contained in:
parent
8483d4d8b3
commit
d7961b28b5
62
stage2/cc.s
62
stage2/cc.s
|
@ -215,12 +215,18 @@
|
||||||
|
|
||||||
|
|
||||||
;; Common in_set strings of interest
|
;; Common in_set strings of interest
|
||||||
|
:nice_chars
|
||||||
|
"
|
||||||
|
!#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
|
||||||
:keyword_chars
|
:keyword_chars
|
||||||
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"
|
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"
|
||||||
:symbol_chars
|
:symbol_chars
|
||||||
"<=>|&!-"
|
"<=>|&!-"
|
||||||
:digit_chars
|
:digit_chars
|
||||||
"0123456789"
|
"0123456789"
|
||||||
|
:whitespace_chars
|
||||||
|
"
|
||||||
|
"
|
||||||
|
|
||||||
;; preserve_keyword function
|
;; preserve_keyword function
|
||||||
;; Recieves a Char in R0, FILE* in R1 and index in R13
|
;; Recieves a Char in R0, FILE* in R1 and index in R13
|
||||||
|
@ -451,9 +457,55 @@
|
||||||
RET R15
|
RET R15
|
||||||
|
|
||||||
|
|
||||||
|
;; weird function
|
||||||
|
;; Recieves char* in R0
|
||||||
|
;; Returns BOOL in R0
|
||||||
:weird
|
:weird
|
||||||
FALSE R0
|
PUSHR R1 R15 ; Protect R1
|
||||||
|
PUSHR R2 R15 ; Protect R2
|
||||||
|
PUSHR R3 R15 ; Protect R3
|
||||||
|
PUSHR R4 R15 ; Protect R4
|
||||||
|
FALSE R2 ; Assume FALSE
|
||||||
|
ADDUI R3 R0 1 ; STRING = STRING + 1
|
||||||
|
:weird_iter
|
||||||
|
JUMP.NZ R2 @weird_done ; Stop if TRUE
|
||||||
|
LOADU8 R4 R3 0 ; C = STRING[0]
|
||||||
|
JUMP.Z R4 @weird_done ; Be done at NULL Termination
|
||||||
|
CMPSKIPI.E R4 92 ; If not '\\'
|
||||||
|
JUMP @weird_post_escape ; Looks like no escape analysis
|
||||||
|
|
||||||
|
;; Deal with the mess
|
||||||
|
COPY R0 R3 ; Using STRING
|
||||||
|
CALLI R15 @escape_lookup ; Get our CHAR
|
||||||
|
MOVE R4 R0 ; C = ESCAPE_LOOKUP(STRING)
|
||||||
|
LOADU8 R0 R3 1 ; STRING[1]
|
||||||
|
CMPSKIPI.NE R0 120 ; if 'x' == STRING[1]
|
||||||
|
ADDUI R3 R3 2 ; STRING = STRING + 2
|
||||||
|
ADDUI R3 R3 1 ; STRING = STRING + 1
|
||||||
|
|
||||||
|
:weird_post_escape
|
||||||
|
LOADUI R1 $nice_chars ; using list of nice CHARS
|
||||||
|
COPY R0 R4 ; using copy of C
|
||||||
|
CALLI R15 @in_set ; Use in_set
|
||||||
|
NOT R0 R0 ; Reverse bool
|
||||||
|
CMPSKIPI.E R0 0 ; IF TRUE
|
||||||
|
TRUE R2 ; Return TRUE
|
||||||
|
ADDUI R3 R3 1 ; STRING = STRING + 1
|
||||||
|
LOADUI R1 $whitespace_chars ; Check Whitespace Chars
|
||||||
|
COPY R0 R4 ; Using copy of C
|
||||||
|
CALLI R15 @in_set ; Use in_set
|
||||||
|
JUMP.Z R0 @weird_iter ; If False simply loop
|
||||||
|
LOADU8 R0 R3 0 ; STRING[1]
|
||||||
|
CMPSKIPI.NE R0 58 ; If ':' == STRING[1]
|
||||||
|
TRUE R2 ; Flip flag
|
||||||
|
JUMP @weird_iter ; Keep trying to find an answer
|
||||||
|
|
||||||
|
:weird_done
|
||||||
|
MOVE R0 R2 ; Whatever is in R2 is the answer
|
||||||
|
POPR R4 R15 ; Restore R4
|
||||||
|
POPR R3 R15 ; Restore R3
|
||||||
|
POPR R2 R15 ; Restore R2
|
||||||
|
POPR R1 R15 ; Restore R1
|
||||||
RET R15
|
RET R15
|
||||||
|
|
||||||
|
|
||||||
|
@ -489,10 +541,12 @@
|
||||||
"
|
"
|
||||||
|
|
||||||
;; escape_lookup function
|
;; escape_lookup function
|
||||||
;; Recieves char* in R1
|
;; Recieves char* in R0
|
||||||
;; Returns char in R0
|
;; Returns char in R0
|
||||||
:escape_lookup
|
:escape_lookup
|
||||||
|
PUSHR R1 R15 ; Protect R1
|
||||||
PUSHR R2 R15 ; Protect R2
|
PUSHR R2 R15 ; Protect R2
|
||||||
|
MOVE R1 R0 ; Put C in the right spot
|
||||||
FALSE R2 ; Our flag for done
|
FALSE R2 ; Our flag for done
|
||||||
LOADU8 R0 R1 1 ; c[1]
|
LOADU8 R0 R1 1 ; c[1]
|
||||||
CMPSKIPI.NE R0 120 ; if \x??
|
CMPSKIPI.NE R0 120 ; if \x??
|
||||||
|
@ -531,6 +585,7 @@
|
||||||
:escape_lookup_done
|
:escape_lookup_done
|
||||||
MOVE R0 R2 ; R2 has our answer
|
MOVE R0 R2 ; R2 has our answer
|
||||||
POPR R2 R15 ; Restore R2
|
POPR R2 R15 ; Restore R2
|
||||||
|
POPR R1 R15 ; Restore R1
|
||||||
RET R15
|
RET R15
|
||||||
|
|
||||||
:escape_lookup_error
|
:escape_lookup_error
|
||||||
|
@ -560,6 +615,7 @@
|
||||||
JUMP @collect_regular_string_iter ; Loop
|
JUMP @collect_regular_string_iter ; Loop
|
||||||
|
|
||||||
:collect_regular_string_escape
|
:collect_regular_string_escape
|
||||||
|
COPY R0 R1 ; Prepare for call
|
||||||
CALLI R15 @escape_lookup ; Get what weird char we need
|
CALLI R15 @escape_lookup ; Get what weird char we need
|
||||||
STORE8 R0 R2 0 ; MESSAGE[0] = escape_lookup(string)
|
STORE8 R0 R2 0 ; MESSAGE[0] = escape_lookup(string)
|
||||||
ADDUI R2 R2 1 ; MESSAGE = MESSAGE + 1
|
ADDUI R2 R2 1 ; MESSAGE = MESSAGE + 1
|
||||||
|
|
Loading…
Reference in New Issue