@@ -965,101 +965,103 @@ SEXP rnng_get_opt(SEXP object, SEXP opt) {
965965 const char * op = CHAR (STRING_ELT (opt , 0 ));
966966 SEXP out ;
967967 int xc , typ ;
968- bool bval ;
969- int ival ;
970- nng_duration dval ;
971- size_t sval ;
972- char * strval ;
973- uint64_t uval ;
968+ union optval_u {
969+ char * str ;
970+ bool b ;
971+ nng_duration d ;
972+ int i ;
973+ size_t s ;
974+ uint64_t u ;
975+ } optval ;
974976
975977 const SEXP ptrtag = R_ExternalPtrTag (object );
976978 if (ptrtag == nano_SocketSymbol ) {
977979
978980 nng_socket * sock = (nng_socket * ) R_ExternalPtrAddr (object );
979981 for (;;) {
980- xc = nng_socket_get_string (* sock , op , & strval );
982+ xc = nng_socket_get_string (* sock , op , & optval . str );
981983 if (xc == 0 ) { typ = 1 ; break ; }
982- xc = nng_socket_get_ms (* sock , op , & dval );
984+ xc = nng_socket_get_ms (* sock , op , & optval . d );
983985 if (xc == 0 ) { typ = 2 ; break ; }
984- xc = nng_socket_get_size (* sock , op , & sval );
986+ xc = nng_socket_get_size (* sock , op , & optval . s );
985987 if (xc == 0 ) { typ = 3 ; break ; }
986- xc = nng_socket_get_int (* sock , op , & ival );
988+ xc = nng_socket_get_int (* sock , op , & optval . i );
987989 if (xc == 0 ) { typ = 4 ; break ; }
988- xc = nng_socket_get_bool (* sock , op , & bval );
990+ xc = nng_socket_get_bool (* sock , op , & optval . b );
989991 if (xc == 0 ) { typ = 5 ; break ; }
990- xc = nng_socket_get_uint64 (* sock , op , & uval );
992+ xc = nng_socket_get_uint64 (* sock , op , & optval . u );
991993 typ = 6 ; break ;
992994 }
993995
994996 } else if (ptrtag == nano_ContextSymbol ) {
995997
996998 nng_ctx * ctx = (nng_ctx * ) R_ExternalPtrAddr (object );
997999 for (;;) {
998- xc = nng_ctx_get_string (* ctx , op , & strval );
1000+ xc = nng_ctx_get_string (* ctx , op , & optval . str );
9991001 if (xc == 0 ) { typ = 1 ; break ; }
1000- xc = nng_ctx_get_ms (* ctx , op , & dval );
1002+ xc = nng_ctx_get_ms (* ctx , op , & optval . d );
10011003 if (xc == 0 ) { typ = 2 ; break ; }
1002- xc = nng_ctx_get_size (* ctx , op , & sval );
1004+ xc = nng_ctx_get_size (* ctx , op , & optval . s );
10031005 if (xc == 0 ) { typ = 3 ; break ; }
1004- xc = nng_ctx_get_int (* ctx , op , & ival );
1006+ xc = nng_ctx_get_int (* ctx , op , & optval . i );
10051007 if (xc == 0 ) { typ = 4 ; break ; }
1006- xc = nng_ctx_get_bool (* ctx , op , & bval );
1008+ xc = nng_ctx_get_bool (* ctx , op , & optval . b );
10071009 if (xc == 0 ) { typ = 5 ; break ; }
1008- xc = nng_ctx_get_uint64 (* ctx , op , & uval );
1010+ xc = nng_ctx_get_uint64 (* ctx , op , & optval . u );
10091011 typ = 6 ; break ;
10101012 }
10111013
10121014 } else if (ptrtag == nano_StreamSymbol ) {
10131015
10141016 nng_stream * st = (nng_stream * ) R_ExternalPtrAddr (object );
10151017 for (;;) {
1016- xc = nng_stream_get_string (st , op , & strval );
1018+ xc = nng_stream_get_string (st , op , & optval . str );
10171019 if (xc == 0 ) { typ = 1 ; break ; }
1018- xc = nng_stream_get_ms (st , op , & dval );
1020+ xc = nng_stream_get_ms (st , op , & optval . d );
10191021 if (xc == 0 ) { typ = 2 ; break ; }
1020- xc = nng_stream_get_size (st , op , & sval );
1022+ xc = nng_stream_get_size (st , op , & optval . s );
10211023 if (xc == 0 ) { typ = 3 ; break ; }
1022- xc = nng_stream_get_int (st , op , & ival );
1024+ xc = nng_stream_get_int (st , op , & optval . i );
10231025 if (xc == 0 ) { typ = 4 ; break ; }
1024- xc = nng_stream_get_bool (st , op , & bval );
1026+ xc = nng_stream_get_bool (st , op , & optval . b );
10251027 if (xc == 0 ) { typ = 5 ; break ; }
1026- xc = nng_stream_get_uint64 (st , op , & uval );
1028+ xc = nng_stream_get_uint64 (st , op , & optval . u );
10271029 typ = 6 ; break ;
10281030 }
10291031
10301032 } else if (ptrtag == nano_ListenerSymbol ) {
10311033
10321034 nng_listener * list = (nng_listener * ) R_ExternalPtrAddr (object );
10331035 for (;;) {
1034- xc = nng_listener_get_string (* list , op , & strval );
1036+ xc = nng_listener_get_string (* list , op , & optval . str );
10351037 if (xc == 0 ) { typ = 1 ; break ; }
1036- xc = nng_listener_get_ms (* list , op , & dval );
1038+ xc = nng_listener_get_ms (* list , op , & optval . i );
10371039 if (xc == 0 ) { typ = 2 ; break ; }
1038- xc = nng_listener_get_size (* list , op , & sval );
1040+ xc = nng_listener_get_size (* list , op , & optval . s );
10391041 if (xc == 0 ) { typ = 3 ; break ; }
1040- xc = nng_listener_get_int (* list , op , & ival );
1042+ xc = nng_listener_get_int (* list , op , & optval . i );
10411043 if (xc == 0 ) { typ = 4 ; break ; }
1042- xc = nng_listener_get_bool (* list , op , & bval );
1044+ xc = nng_listener_get_bool (* list , op , & optval . b );
10431045 if (xc == 0 ) { typ = 5 ; break ; }
1044- xc = nng_listener_get_uint64 (* list , op , & uval );
1046+ xc = nng_listener_get_uint64 (* list , op , & optval . u );
10451047 typ = 6 ; break ;
10461048 }
10471049
10481050 } else if (ptrtag == nano_DialerSymbol ) {
10491051
10501052 nng_dialer * dial = (nng_dialer * ) R_ExternalPtrAddr (object );
10511053 for (;;) {
1052- xc = nng_dialer_get_string (* dial , op , & strval );
1054+ xc = nng_dialer_get_string (* dial , op , & optval . str );
10531055 if (xc == 0 ) { typ = 1 ; break ; }
1054- xc = nng_dialer_get_ms (* dial , op , & dval );
1056+ xc = nng_dialer_get_ms (* dial , op , & optval . i );
10551057 if (xc == 0 ) { typ = 2 ; break ; }
1056- xc = nng_dialer_get_size (* dial , op , & sval );
1058+ xc = nng_dialer_get_size (* dial , op , & optval . s );
10571059 if (xc == 0 ) { typ = 3 ; break ; }
1058- xc = nng_dialer_get_int (* dial , op , & ival );
1060+ xc = nng_dialer_get_int (* dial , op , & optval . i );
10591061 if (xc == 0 ) { typ = 4 ; break ; }
1060- xc = nng_dialer_get_bool (* dial , op , & bval );
1062+ xc = nng_dialer_get_bool (* dial , op , & optval . b );
10611063 if (xc == 0 ) { typ = 5 ; break ; }
1062- xc = nng_dialer_get_uint64 (* dial , op , & uval );
1064+ xc = nng_dialer_get_uint64 (* dial , op , & optval . u );
10631065 typ = 6 ; break ;
10641066 }
10651067
@@ -1072,22 +1074,13 @@ SEXP rnng_get_opt(SEXP object, SEXP opt) {
10721074
10731075 switch (typ ) {
10741076 case 1 :
1075- out = Rf_mkString (strval );
1077+ out = Rf_mkString (* ( char * * ) & optval );
10761078 break ;
1077- case 2 :
1078- out = Rf_ScalarInteger ((int ) dval );
1079- break ;
1080- case 3 :
1081- out = Rf_ScalarInteger ((int ) sval );
1082- break ;
1083- case 4 :
1084- out = Rf_ScalarInteger (ival );
1085- break ;
1086- case 5 :
1087- out = Rf_ScalarLogical ((int ) bval );
1079+ case 6 :
1080+ out = Rf_ScalarReal (* (double * ) & optval );
10881081 break ;
10891082 default :
1090- out = Rf_ScalarReal (( double ) uval );
1083+ out = Rf_ScalarInteger ( * ( int * ) & optval );
10911084 }
10921085
10931086 return out ;
0 commit comments