Selaa lähdekoodia

Fixed String escape parsing.

woollybah 6 vuotta sitten
vanhempi
commit
677eb706d7
6 muutettua tiedostoa jossa 63 lisäystä ja 29 poistoa
  1. 46 25
      config.bmx
  2. 2 2
      iparser.bmx
  3. 3 2
      parser.bmx
  4. 1 0
      stringbuffer_common.bmx
  5. 5 0
      stringbuffer_core.bmx
  6. 6 0
      stringbuffer_glue.c

+ 46 - 25
config.bmx

@@ -187,35 +187,56 @@ Function BmxEnquote$( str$ )
 	Return str
 End Function
 
-Function BmxUnquote$( str$, unicodeConvert:Int = False )
+Function BmxUnquote$( str$ )
 	If str.length = 1 Or str[str.length - 1] <> Asc("~q") Then
 		Err "Expecting expression but encountered malformed string literal"
 	End If
-	str=str[1..str.Length-1]
-	If unicodeConvert Then
-		Local pos:Int = str.Find("~~")
-		While pos <> -1
-			If pos + 1 < str.length Then
-				If str[pos + 1] >= Asc("1") And str[pos + 1] <= Asc("9") Then
-					Local p2:Int = str.Find("~~", pos + 1)
-					If p2 <> -1 Then
-						Local s:String = Chr(str[pos + 1.. p2].ToInt())
-						str = str[..pos] + s + str[p2 + 1..]
-					End If
-				End If
-			End If
+	Local length:Int = str.length - 1
+	Local sb:TStringBuffer = New TStringBuffer
+	Local i:Int = 1
+	While i < length
+		Local c:Int = str[i]
+		i :+ 1
+		If c <> Asc("~~") Then
+			sb.AppendChar(c)
+			Continue
+		End If
+
+		If i = length Err "Bad escape sequence in string"
 		
-			pos = str.Find("~~", pos + 1)
-		Wend
-	End If
-	str=str.Replace( "~~~~","~~z" )	'a bit dodgy - uses bad esc sequence ~z 
-	str=str.Replace( "~~q","~q" )
-	str=str.Replace( "~~n","~n" )
-	str=str.Replace( "~~r","~r" )
-	str=str.Replace( "~~t","~t" )
-	str=str.Replace( "~~0","~0" )
-	str=str.Replace( "~~z","~~" )
-	Return str
+		c = str[i]
+		i :+ 1
+		
+		Select c
+			Case Asc("~~")
+				sb.AppendChar(c)
+			Case Asc("0")
+				sb.AppendChar(0)
+			Case Asc("t")
+				sb.AppendChar(Asc("~t"))
+			Case Asc("r")
+				sb.AppendChar(Asc("~r"))
+			Case Asc("n")
+				sb.AppendChar(Asc("~n"))
+			Case Asc("q")
+				sb.AppendChar(Asc("~q"))
+			Default
+				If c >= Asc("1") And c <= Asc("9") Then
+					Local n:Int
+					While c >= Asc("0") And c <= Asc("9") 
+						n = n * 10 + (c-Asc("0"))
+						If i = length Err "Bad escape sequence in string"
+						c = str[i]
+						i :+ 1
+					Wend
+					If c <> Asc("~~") Err "Bad escape sequence in string"
+					sb.AppendChar(n)
+				Else
+					Err "Bad escape sequence in string"
+				End If
+		End Select
+	Wend
+	Return sb.ToString()
 End Function
 
 Type TStack Extends TList

+ 2 - 2
iparser.bmx

@@ -620,7 +620,7 @@ Type TIParser
 					expr=New TConstExpr.Create( New TFloatType,value )
 				End If
 			Case TOKE_STRINGLIT
-				expr=New TConstExpr.Create( New TStringType,BmxUnquote( _toke, True ) )
+				expr=New TConstExpr.Create( New TStringType,BmxUnquote( _toke ) )
 				NextToke
 			Case TOKE_IDENT
 				If _toke = "nan" Or _toke = "inf" Then
@@ -944,7 +944,7 @@ Type TIParser
 
 	Method ParseStringLit$()
 		If _toker._tokeType<>TOKE_STRINGLIT Err "Expecting string literal."
-		Local str$=BmxUnquote( _toker._toke, True )
+		Local str$=BmxUnquote( _toker._toke )
 		'_toker.
 		NextToke
 		Return str

+ 3 - 2
parser.bmx

@@ -1381,8 +1381,9 @@ Type TParser Extends TGenProcessor
 					TConstExpr(expr).ty = ty
 				End If
 			Case TOKE_STRINGLIT
-				expr=New TConstExpr.Create( TType.stringType,BmxUnquote( _toke ) )
-				_app.mapStringConsts(BmxUnquote( _toke ))
+				Local s:String = BmxUnquote( _toke )
+				expr=New TConstExpr.Create( TType.stringType,s )
+				_app.mapStringConsts(s)
 				NextToke
 			Default
 				Err "Expecting expression but encountered "+DescribeToke(_toke)

+ 1 - 0
stringbuffer_common.bmx

@@ -34,6 +34,7 @@ Extern
 	Function bmx_stringbuffer_setlength(buffer:Byte Ptr, length:Int)
 	Function bmx_stringbuffer_tostring:String(buffer:Byte Ptr)
 	Function bmx_stringbuffer_append_string(buffer:Byte Ptr, value:String)
+	Function bmx_stringbuffer_append_char(buffer:Byte Ptr, value:Int)
 	Function bmx_stringbuffer_remove(buffer:Byte Ptr, startIndex:Int, endIndex:Int)
 	Function bmx_stringbuffer_insert(buffer:Byte Ptr, offset:Int, value:String)
 	Function bmx_stringbuffer_reverse(buffer:Byte Ptr)

+ 5 - 0
stringbuffer_core.bmx

@@ -145,6 +145,11 @@ Type TStringBuffer
 		bmx_stringbuffer_append_shorts(buffer, shorts, length)
 		Return Self
 	End Method
+	
+	Method AppendChar:TStringBuffer(char:Int)
+		bmx_stringbuffer_append_char(buffer, char)
+		Return Self
+	End Method
 
 	Rem
 	bbdoc: Finds first occurance of a sub string.

+ 6 - 0
stringbuffer_glue.c

@@ -511,6 +511,12 @@ void bmx_stringbuffer_append_shorts(struct MaxStringBuffer * buf, short * shorts
 	}	
 }
 
+void bmx_stringbuffer_append_char(struct MaxStringBuffer * buf, int value) {
+	bmx_stringbuffer_resize(buf, buf->count + 1);
+	BBChar * p = buf->buffer + buf->count;
+	*p = (BBChar)value;
+	buf->count++;
+}
 /* ----------------------------------------------------- */
 
 int bmx_stringbuffer_splitbuffer_length(struct MaxSplitBuffer * buf) {