Ignore:
Timestamp:
Nov 17, 2007, 10:01:49 AM (17 years ago)
Author:
イグトランス (egtra)
Message:

ポインタ演算を64ビット用に修正(po印)。%pへの準備。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Include/Classes/ActiveBasic/Strings/SPrintF.ab

    r383 r384  
    926926
    927927/*!
     928@brief  SPrintfから呼ばれる浮動小数点数用書式文字列化関数
    928929@author Egtra
    929930@date   2007/10/28
     
    943944
    944945/*!
     946@brief  SPrintfから呼ばれる整数用書式文字列化関数
    945947@author Egtra
    946948@date   2007/10/28
     
    10541056Function ReadInt(ByRef fmt As *StrChar, params As *Object, ByRef paramsCount As SIZE_T, ByRef ret As Long) As Boolean
    10551057    If fmt[0] = &h2a Then '*
    1056         fmt++ 'p
     1058        fmt = VarPtr(fmt[1]) 'po
    10571059        ret = params[paramsCount] As System.Int32
    10581060        paramsCount++
     
    11001102                Exit Do
    11011103        End Select
    1102         fmt++ 'p
     1104        fmt = VarPtr(fmt[1]) 'po
    11031105    Loop
    11041106    ReadFlags = True
     
    11431145
    11441146    If fmt[0] = &h2e Then '.
    1145         fmt++
     1147        fmt = VarPtr(fmt[1]) 'po
    11461148        Dim t As Long
    11471149        ReadPrecision = 0
     
    11551157    End If
    11561158End Function
     1159
     1160#ifdef _WIN64
     1161Const PtrLength = 1
     1162#else
     1163Const PtrLength = 0
     1164#endif
    11571165
    11581166/*!
     
    11701178            Case &h68 'h
    11711179                lengthSpec--
    1172             Case &h6a 'j (u)intmax_t
     1180            Case &h6a 'j (u)intmax_t = QWord, Int64
    11731181                lengthSpec = 1
    1174 #ifdef _WIN64
    11751182            Case &h74 't ptrdiff_t
    1176                 lengthSpec = 1
    1177             Case &h7a 'z (s)size_t,
    1178                 lengthSpec = 1
    1179 #else
    1180             Case &h74 't ptrdiff_t
    1181                 lengthSpec = 0
    1182             Case &h7a 'z (s)size_t,
    1183                 lengthSpec = 0
    1184 #endif
     1183                lengthSpec = PtrLength
     1184            Case &h7a 'z (s)size_t
     1185                lengthSpec = PtrLength
     1186            Case &h70 'p VoidPtr 本来は変換指定子だが、ここで先読み
     1187                lengthSpec = PtrLength
     1188                Exit Sub 'fmtを進められると困るので、ここで脱出
    11851189            Case Else
    11861190                Exit Sub
    11871191        End Select
    1188         fmt++ 'p
     1192        fmt = VarPtr(fmt[1]) 'po
    11891193    Loop
    11901194End Sub
    11911195
    11921196/*!
    1193 @author Egtra
    1194 @date   2007/10/27
     1197@biref  Cのsprintfのような書式文字列出力関数
     1198@author Egtra
     1199@date   2007/10/27
     1200@param[in] format   書式文字列。詳細は開発Wiki参照。
     1201@param[in, out] params  変換対象の配列。n = 0のときにはNULLも可。
     1202@param[in] n    paramsの個数。
     1203@return 書式化された文字列。
    11951204@todo   %nへの対応
    11961205*/
     
    12011210    Dim s = New System.Text.StringBuilder
    12021211    Do
    1203         Dim last = format.Length - (fmt - StrPtr(format)) As Long 'p
     1212        Dim last = format.Length - (((fmt - StrPtr(format)) \ SizeOf (StrChar)) As LONG_PTR) As Long 'po
    12041213        Dim pos = ActiveBasic.Strings.ChrFind(fmt, last, &h25 As StrChar) '&h25 = %
    12051214        If pos = -1 Then
     
    12091218        '%以前の部分
    12101219        s.Append(fmt, 0, pos)
    1211         fmt += pos + 1 'p
     1220        fmt = VarPtr(fmt[pos + 1]) 'po
    12121221        'フラグの読取
    12131222        Dim flags = None As FormatFlags
     
    12391248            Case &h58 'X
    12401249                FormatInteger(s, TraitsIntegerX, params[i], False, typeWidth, precision, fieldWidth, flags Or Cap)
     1250'現状ではVoidPtrを引数にする手段は無いはず
     1251'           Case &h58 'p
     1252'               FormatInteger(s, TraitsIntegerX, params[i], False, typeWidth, precision, fieldWidth, flags Or Cap)
    12411253            Case &h65 'e
    12421254                FormatFloat(s, AddressOf(FormatFloatE), params[i], precision, fieldWidth, flags)
     
    12661278                Exit Do
    12671279        End Select
    1268         fmt++ 'p
     1280        fmt = VarPtr(fmt[1]) 'po
    12691281        i++
    12701282    Loop
Note: See TracChangeset for help on using the changeset viewer.