Make a guess:

  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)