LINUX.ORG.RU

История изменений

Исправление MKuznetsov, (текущая версия) :

путь примерения с лиспом

char *collect(GVariantIter* iter)
{
  // проблемка - нужен буфер неизвестного размера
  // или на каждом шаге реаллоцировать
  // циклы с предрасчётом неспортивно,
  // поэтому путь самурая - рекурсия
  char *buffer=NULL; // тот самый буфер

  void recursion(int offset,GVariant *iter) {
     gchar *str=NULL;
     if (g_variant_iter_loop(iter,"s",&str)) {
        int len=strlen(str);
        recursion(offset+len,iter);
        memcpy(buffer+offset,str,len);
     } else {
        buffer=malloc(offset+1);
        buffer[offset]=0;
     }
  }
  recursion(0,iter);
  return buffer;
}

с руки, как-то так...не проверял ;-)

Исходная версия MKuznetsov, :

путь примерения с лиспом

char *collect(GVariantIter* iter)
{
  // проблемка - нужен буфер неизвестного размера
  // или на каждом шаге реаллоцировать
  // циклы с предрасчётом неспортивно,
  // поэтому путь самурая - рекурсия
  char *buffer=NULL; // тот самый буфер

  void recursion(int offset,GVariant *iter) {
     gchar *str=NULL;
     if (g_variant_iter_loop(iter,"s",&str)) {
        int len=strlen(str);
        recursion(offset+len,iter);
        memcpy(buffer+offset,str,len);
     } else {
        buffer=malloc(offset+1);
        buffer[offset]=0;
     }
  }
  return buffer;
}

с руки, как-то так...не проверял ;-)