anum = wid = prec = 0;
i = *Index;
while (str[i]) {
if (str[i] == '%') {
*StartPos = *EndPos = i++;
while (strchr("#0- +'", str[i]))
i++; /* Skip flag characters */
while (str[i] >= '0' && str[i] <= '9')
wid = wid * 10 + str[i++] - '0';
if (str[i] == '$') {
*EndPos = i;
i++;
anum = wid;
wid = 0;
while (strchr("#0- +'", str[i]))
i++; /* Skip flag characters */
while (str[i] >= '0' && str[i] <= '9')
wid = wid * 10 + str[i++] - '0';
}
if (str[i] == '.') {
i++;
while (str[i] >= '0' && str[i] <= '9')
prec = prec * 10 + str[i++] - '0';
}
*FmtPos = i;
type = str[i];
if ((type == 'T' || type == 't') && i + 2 < strlen(str)) {
Code[0] = str[i + 1];
Code[1] = str[i + 2];
Code[2] = 0;
i += 3;
} else if (type == '/') {
i++;
while (str[i] != '\0' && str[i] != '/')
i++;
if (str[i] == '/')
i++;
} else
i++;
*ArgNum = anum;
*Wid = wid;
*Prec = prec;
*Index = i;
*Type = type;
return;
} else
i++;
}
*Index = i;
}
gchar *HandleTFmt(gchar *format, va_list va)
{
int StrInd, StartPos, EndPos, FmtPos, Wid, Prec, ArgNum, DefaultArgNum;
guint i;
char Code[3], Type;
gchar *retstr, *fstr;
GString *string, *tmpfmt;
GArray *arr;
FmtData *fdat;
string = g_string_new("");
tmpfmt = g_string_new("");
arr = g_array_new(FALSE, TRUE, sizeof(FmtData));
i = DefaultArgNum = 0;
while (i < strlen(format)) {
GetNextFormat(&i, format, &StartPos, &EndPos, &FmtPos, &Type, &ArgNum,
&Wid, &Prec, Code);
if (StartPos == -1)
break;
if (ArgNum == 0)
ArgNum = ++DefaultArgNum;
if (ArgNum > arr->len) {
g_array_set_size(arr, ArgNum);
}
g_array_index(arr, FmtData, ArgNum - 1).Type = Type;
}
for (i = 0; i < arr->len; i++) {
fdat = &g_array_index(arr, FmtData, i);
switch (fdat->Type) {
case '\0':
g_error("Incomplete format string!");
break;
case 'd':
fdat->data.IntVal = va_arg(va, int);
break;
case 'P':
fdat->data.PriceVal = va_arg(va, price_t);
break;
case 'c':
fdat->data.CharVal = (char)va_arg(va, int);
break;
case 's':
case 't':
case 'T':
fdat->data.StrVal = va_arg(va, char *);
break;
case '%':
case '/':
break; /* No special action for %% or %/.../ */
default:
g_error("Unknown format type %c!", fdat->Type);
}
}
i = DefaultArgNum = 0;
while (i < strlen(format)) {
StrInd = i;
GetNextFormat(&i, format, &StartPos, &EndPos, &FmtPos, &Type, &ArgNum,
&Wid, &Prec, Code);
if (StartPos == -1) {
g_string_append(string, &format[StrInd]);
break;
}
while (StrInd < StartPos)
g_string_append_c(string, format[StrInd++]);
if (ArgNum == 0)