История изменений
Исправление 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;
}
с руки, как-то так...не проверял ;-)