[22:01:58] <landgraf> как из Unbounded_String вытащить String_Access?
[22:02:36] <landgraf>   type Unbounded_String is new AF.Controlled with record
     Reference : String_Access := Null_String'Access;
[22:02:43] <yeo> там внутри есть только Wide_String_Access
[22:02:55] <yeo> ой, это я спутал с universal string
[22:03:13] <yeo> нужно сделать дочерний пакет
[22:05:09] <yeo> но это хакерство, и оно сломается при обновлении компилятора, потому что в новых версиях Unbounded_String внутри уже почти как Universal_String :)
[22:06:59] <landgraf>         when Parameter_Text    => Str_Val : access constant String;
[22:07:10] <landgraf> а как сюда запихивать из US?
[22:08:17] <yeo> ну можно Str_Val := new String'(To_String (My_US));
[22:08:32] <landgraf> а потом Free на нее?
[22:08:40] <yeo> да
[22:08:47] <landgraf> сейчас попробую
[22:08:53] <landgraf> yeo, спасибо
[22:10:11] <yeo> если хочется взломать US, то
function Ada.Strings.Unbounded.Get_Access
 (Self : Unbounded_String) return String_Access is
begin return Self.Reference; end Ada.Strings.Unbounded.Get_Access;
[22:11:29] <yeo> и компилять этот файл с ключем -gnatg
[22:11:38] <landgraf> arpm_db_containers.adb:108:36: expected type "Ada.Strings.Unbounded.String_Access"
arpm_db_containers.adb:108:36: found private type "Ada.Strings.Unbounded.Unbounded_String"
[22:11:40] <landgraf> :(
[22:12:04] <landgraf> 109         type Str_Access is access all String;
110         Version : Str_Access := new String'(To_String(RPM.Name));
[22:12:15] <landgraf> тьфу блин
[22:12:19] <landgraf> сам балбес, знаю
[22:19:00] <landgraf> http://fpaste.org/10429/36769151/ откуда такое может вылезать? проверил все, не должно быть неициализированных переменных
[22:23:48] <yeo> какой-то exception там еще
[22:35:59] <landgraf> значит буду ждать vgodunko, чтобы попытать его как ускорить матрешку :)
[22:36:18] <landgraf> разница в 5 раз с gnatcoll-ом по производительности :(
[22:42:46] <landgraf> http://fpaste.org/10433/76929481/ это я пытаюсь пустую строку декодировать?
[22:45:11] <yeo> не знаю
[22:49:55] <landgraf> INTERFACES.C.STRINGS.DEREFERENCE_ERROR
[22:51:49] <landgraf> URL=(null)
[22:51:55] <landgraf> вот и причина :(
[23:01:48] <landgraf> накостылил.
[23:02:26] <landgraf> yeo, а как "правильно" обработать случай, когда возвращается структура в которой один из char* пустой?  
[23:08:13] <yeo> наверное прийдеться явно проверять
[23:09:12] <landgraf> так проверять получается только из сишного кода
[23:09:34] <landgraf> иначе сразу  после импорта вылетает INTERFACES.C.STRINGS.DEREFERENCE_ERROR
[23:10:44] <landgraf> char* get_txt(Header hdr, rpmtd td, rpmTagVal tag){
   int rc;
   char* name;
   rpmtdFreeData(td);
   rpmtdReset(td);
   rc = headerGet(hdr, tag, td, HEADERGET_EXT);
   if (rpmtdGetString(td)  == NULL)
   {
       name = strdup((char*) "ARPMNULL");
   } else
   {
       name =  strdup((char*) rpmtdGetString(td));
   };
   return name;
}


костыль (((
[23:10:49] <yeo> DEREFERENCE_ERROR это исключение при вызове функции To_String с пустым аргументом
[23:10:59] <landgraf> а, хм
[23:11:07] <landgraf> это я надебагил.
[23:12:18] <landgraf> yeo,
       function Create(Filename : String)
           return My_RPM_Struct_Access is

           File_Name : Chars_Ptr := New_String(Filename);
           MyRPM : My_RPM_Struct_Access := new My_RPM_Struct;
       begin
           Parse_RPM(File_name, MyRPM.all);
           Free(File_Name);
           return MyRPM;
       exception
           when others =>
               pragma Debug(Put_Line("Unknown error: arpm_c_bridge"));
               MyRPM.Error := 77;
               return MyRPM;
       end  Create;

[23:12:34] <landgraf> вот тут Unknown Error всегда получался на пустых строках
[23:12:49] <landgraf> Parse_RPM -> импортированная функция
[23:14:23] <landgraf> и как раз тут SIGSERV вылетал
[23:16:08] <yeo> посмотри трейсбек, например в отлабчике, там можно поставить брейк поинт на любое адское исключение
[23:18:05] <yeo> или закоментируй exception when others часть
[23:19:33] <landgraf> тогда все сломается :)
[23:19:50] <yeo> ну хоть будет понятно где
[23:20:31] <landgraf> нет, не будет, у меня этот метод вызывает из таска, сломается таск и все (
[23:20:39] <landgraf> сейчас под gdb запущу
[23:21:45] <yeo> напиши start потом br exception
[23:21:53] <landgraf> Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff1d97700 (LWP 21503)]
__strlen_sse2 () at ../sysdeps/x86_64/strlen.S:31
31movdqu(%rdi), %xmm1
[23:22:58] <landgraf> сегфолтится на Parse_RPM
[23:23:39] <yeo> может какой-то мусор передается в strlen?
[23:23:56] <landgraf> yeo, https://github.com/landgraf/arpm/blob/master/src/arpm_rpm_internals.ads - My_RPM_Struct  передается из сишного кода
[23:24:28] <landgraf> yeo, вот код без костыля - https://github.com/landgraf/arpm/blob/master/src/c/rpm_wrappers.c
[23:24:52] <landgraf>    char* name = strdup((char*) rpmtdGetString(td)); - может тут сегфолт?
[23:24:59] <yeo> может там брейкпоинт поставить и глянуть значения?
[23:25:23] <landgraf> не умею :(
[23:29:00] <yeo> а если в отладчике написать backtrace после того как он выдал Program received signal SIGSEGV?
[23:30:37] <landgraf> #1  0x00007ffff586fd66 in __GI___strdup (s=0x0) at strdup.c:41
[23:30:51] <landgraf> strdup сегфолтится на пустой строке
[23:31:16] <landgraf> вернее gettdString NULL выдает и оно падает
[23:36:39] <landgraf> как пустой char* сделать? char* name = NULL ?
[23:37:13] <yeo> да
[23:37:41] <vgodunko> char *x = rpmtdGetString (...);
if (x == NULL) { ... } else { ... };
[23:38:09] <landgraf> 102     if (rpmtdGetString(td)  != NULL)
103     {
104         name =  strdup((char*) rpmtdGetString(td));
105     } else{
106         name = NULL;
107     };
108     return name;
109 }
[23:38:12] <landgraf> так?
[23:38:25] <yeo> да
[23:39:29] <landgraf> так и знал что без сегфолтов не обойдется :(
[23:39:40] <yeo> :-)
[23:41:02] <landgraf> yeo, если передавать NULL - потом Value(Chars_Ptr) падает, лучше я буду strdup((char*) "") передавать )
[23:41:28] <landgraf> чем проверять каждое поле на Nul_Ptr потом
[23:42:00] <nordwind_> ночи
[23:42:58] <landgraf> Sat May  4 21:42:46  время детское, самое сегфолтное )
[23:47:01] <landgraf> vgodunko, в Q.Bind_Value закрался пробел в конце ключа - долго искал причину, молчаливая такая матрешка :(
[23:47:40] <vgodunko> Сделать исключение?
[23:49:31] <landgraf> а разве разрешено параметрами с пробелами использовать?
[23:49:40] <landgraf> если нет - их можно просто выкидывать :)
[23:52:20] <landgraf> Q.Bind_Value (+":url ", League.Holders.To_Holder(RPM.url)); - я вот про этот пробел
[23:52:43] <vgodunko> Да я понял прокакой
[23:52:54] <vgodunko> Это же неправильно :-)