diff --git a/Header.pas b/Header.pas index bfa521f..b1c3c30 100644 --- a/Header.pas +++ b/Header.pas @@ -18,7 +18,7 @@ uses CCommon, MM, Scanner, Symbol, CGI; {$segment 'HEADER'} const - symFileVersion = 48; {version number of .sym file format} + symFileVersion = 49; {version number of .sym file format} var inhibitHeader: boolean; {should .sym includes be blocked?} @@ -1021,6 +1021,8 @@ procedure EndInclude {chPtr: ptr}; WriteByte(18) else if tp = utf32StringTypePtr then WriteByte(19) + else if tp = utf8StringTypePtr then + WriteByte(20) else if tp^.saveDisp <> 0 then begin WriteByte(1); WriteLong(tp^.saveDisp); @@ -1800,6 +1802,7 @@ var 17: tp := uShortPtr; 18: tp := utf16StringTypePtr; 19: tp := utf32StringTypePtr; + 20: tp := utf8StringTypePtr; otherwise: begin PurgeSymbols; diff --git a/Parser.pas b/Parser.pas index 3df9a64..563792f 100644 --- a/Parser.pas +++ b/Parser.pas @@ -2078,8 +2078,11 @@ var end; pointerType: - if (etype = stringTypePtr) or (etype = utf16StringTypePtr) - or (etype = utf32StringTypePtr) then begin + if (etype = stringTypePtr) + or (etype = utf8StringTypePtr) + or (etype = utf16StringTypePtr) + or (etype = utf32StringTypePtr) + then begin iPtr^.isConstant := true; iPtr^.basetype := ccPointer; iPtr^.pval := 0; diff --git a/Symbol.pas b/Symbol.pas index 9f2d471..0d60dae 100644 --- a/Symbol.pas +++ b/Symbol.pas @@ -47,6 +47,8 @@ { charPtrPtr - pointer to type record for char * } { vaInfoPtr - pointer to type record for internal va info type } { stringTypePtr - pointer to the base type for string literals } +{ utf8StringTypePtr - pointer to the base type for UTF-8 } +{ string literals (used in C23 or later) } { utf16StringTypePtr - pointer to the base type for UTF-16 } { string literals } { utf32StringTypePtr - pointer to the base type for UTF-32 } @@ -95,9 +97,9 @@ var {base types} charPtr,sCharPtr,uCharPtr,shortPtr,uShortPtr,intPtr,uIntPtr,int32Ptr, uInt32Ptr,longPtr,uLongPtr,longLongPtr,uLongLongPtr,boolPtr, - floatPtr,doublePtr,compPtr,extendedPtr,stringTypePtr,utf16StringTypePtr, - utf32StringTypePtr,voidPtr,voidPtrPtr,charPtrPtr,vaInfoPtr,constCharPtr, - defaultStruct: typePtr; + floatPtr,doublePtr,compPtr,extendedPtr,stringTypePtr,utf8StringTypePtr, + utf16StringTypePtr,utf32StringTypePtr,voidPtr,voidPtrPtr,charPtrPtr, + vaInfoPtr,constCharPtr,defaultStruct: typePtr; {---------------------------------------------------------------} @@ -1897,6 +1899,15 @@ with stringTypePtr^ do begin aType := charPtr; elements := 0; end; {with} +new(utf8StringTypePtr); {UTF-8 string constant type (C23+)} +with utf8StringTypePtr^ do begin + size := 0; + saveDisp := 0; + qualifiers := []; + kind := arrayType; + aType := uCharPtr; + elements := 0; + end; {with} new(utf16StringTypePtr); {UTF-16 string constant type} with utf16StringTypePtr^ do begin size := 0; @@ -2592,8 +2603,14 @@ function StringType{prefix: charStrPrefixEnum): typePtr}; { prefix - the prefix } begin {StringType} -if prefix in [prefix_none,prefix_u8] then +if prefix = prefix_none then StringType := stringTypePtr +else if prefix = prefix_u8 then begin + if cStd < c23 then + StringType := stringTypePtr + else + StringType := utf8StringTypePtr; + end {else if} else if prefix in [prefix_u16,prefix_L] then StringType := utf16StringTypePtr else