@@ -422,8 +422,8 @@ decode_var(P=#arg{name=Name, in=true, alt=Alt,
422422
423423
424424decode_var (P = # arg {name = Name , in = false ,
425- type = # type {name = T , base = Base , size = Szs }}, Argc )
426- when Base =:= binary ; Base =:= string ->
425+ type = # type {name = T , base = Base , size = Szs , single = Single }}, Argc )
426+ when not is_tuple ( Single ), ( Base =:= binary orelse Base =:= string ) ->
427427 Sz = case Szs of
428428 {Max ,_ } when is_integer (Max ) -> integer_to_list (Max );
429429 {Max ,_ } -> Max ;
@@ -454,6 +454,19 @@ decode_var(P=#arg{name=Name, in=false, type=#type{name=T,single={list,Sz,_}}}, A
454454 w (" std::vector <~s > ~s (~s );\n " , [T , Name , Sz ]),
455455 w (" std::vector <ERL_NIF_TERM> ~s _ts (~s );\n " , [Name , Sz ]),
456456 {P ,Argc };
457+ decode_var (P = # arg {name = Name , in = false ,
458+ type = # type {base = Base , name = T ,single = {list ,Sz ,_ ,_ }, size = Size }}, Argc ) ->
459+ case Base of
460+ string ->
461+ {BinSize , _ } = Size ,
462+ w (" ~s = (unsigned char *) enif_alloc((int) ~s *sizeof(~s ));\n " , [Name ,BinSize ,T ]),
463+ w (" unsigned char *~s _ptr = ~s ;\n " , [Name ,Name ]),
464+ store_free (Name ++ " _ptr" );
465+ _ ->
466+ exit ({? LINE , Base , P })
467+ end ,
468+ w (" std::vector <ERL_NIF_TERM> ~s _ts (~s );\n " , [Name , Sz ]),
469+ {P ,Argc };
457470decode_var (P = # arg {name = Name , in = true , type = # type {name = " GLUquadric" }}, Argc ) ->
458471 w (" if(!egl_get_ptr(env, argv[~w ], (void **) &~s )) Badarg(~w ,\" ~s \" );~n " ,
459472 [Argc , Name ,? OP ,Name ]),
@@ -576,10 +589,6 @@ build_ret(Name,_Q,#type{name=T,base=Base,size=Sz,single=true})
576589 Ptr -> io_lib :format (" enif_make_uint64(env, (egl_uint64_t) ~s )" , [Name ]);
577590 true -> io_lib :format (" enif_make_int64(env, (egl_int64_t) ~s )" , [Name ])
578591 end ;
579- build_ret (Name ,_Q ,# type {base = string ,single = true }) ->
580- io_lib :format (" enif_make_string(env, (const char *) ~s , ERL_NIF_LATIN1)" ,[Name ]);
581- build_ret (Name ,_Q ,# type {base = string ,size = {_ ,_OutSz }}) ->
582- io_lib :format (" enif_make_string(env, (const char *) ~s , ERL_NIF_LATIN1)" ,[Name ]);
583592build_ret (Name ,_Q ,# type {name = _T ,base = float ,size = Sz ,single = true }) ->
584593 if Sz =< 4 -> io_lib :format (" enif_make_double(env, (double) ~s )" , [Name ]);
585594 true -> io_lib :format (" enif_make_double(env, ~s )" , [Name ])
@@ -602,6 +611,12 @@ build_ret(Name,false,#type{single={list,Sz}}) when Sz >= 10, is_integer(Sz) ->
602611 io_lib :format (" enif_make_list_from_array(env, ~s _ts, ~w )" ,[Name , Sz ]);
603612build_ret (Name ,false ,# type {single = {list ,_ ,Sz }}) ->
604613 io_lib :format (" enif_make_list_from_array(env, ~s _ts.data(), ~s )" ,[Name , Sz ]);
614+ build_ret (Name ,false ,# type {single = {list ,_ ,Sz ,_ }}) ->
615+ io_lib :format (" enif_make_list_from_array(env, ~s _ts.data(), ~s )" ,[Name , Sz ]);
616+ build_ret (Name ,_Q ,# type {base = string ,single = true }) ->
617+ io_lib :format (" enif_make_string(env, (const char *) ~s , ERL_NIF_LATIN1)" ,[Name ]);
618+ build_ret (Name ,_Q ,# type {base = string ,size = {_ ,_OutSz }}) ->
619+ io_lib :format (" enif_make_string(env, (const char *) ~s , ERL_NIF_LATIN1)" ,[Name ]);
605620build_ret (Name ,_Q ,T = # type {}) ->
606621 io :format (" {~p , {~p , {single,{tuple,X}}}}.~n " , [get (current_func ),Name ]),
607622 io :format (" ~p~n " ,[T ]).
@@ -615,6 +630,12 @@ prepare_ret(#arg{name=Name, type=#type{single={list,_,Sz}}=T}) ->
615630 Fetch = build_ret (Name ++ " [ri]" , false , T # type {single = true }),
616631 w (" for(int ri=0; ri < (int) ~s ; ri++)\n "
617632 " ~s _ts[ri] = ~s ;\n " ,[Sz , Name , Fetch ]);
633+ prepare_ret (# arg {name = Name , type = # type {single = {list ,_ ,Sz ,Lengths }}= T }) ->
634+ Fetch = build_ret (Name , false , T # type {single = true }),
635+ w (" for(int ri=0; ri < (int) ~s ; ri++) {\n "
636+ " ~s _ts[ri] = ~s ;\n " ,[Sz , Name , Fetch ]),
637+ w (" ~s += ~s [ri];\n "
638+ " }\n " , [Name , Lengths ]);
618639prepare_ret (_ ) ->
619640 ok .
620641
0 commit comments