Skip to content

Commit 387ff70

Browse files
committed
union for opts
1 parent 2b9480a commit 387ff70

File tree

3 files changed

+44
-51
lines changed

3 files changed

+44
-51
lines changed

DESCRIPTION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Package: nanonext
22
Type: Package
33
Title: NNG (Nanomsg Next Gen) Lightweight Messaging Library
4-
Version: 0.9.2.9039
4+
Version: 0.9.2.9040
55
Description: R binding for NNG (Nanomsg Next Gen), a successor to ZeroMQ. NNG is
66
a socket library providing high-performance scalability protocols, a
77
cross-platform standard for messaging and communications. Serves as a

NEWS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# nanonext 0.9.2.9039 (development)
1+
# nanonext 0.9.2.9040 (development)
22

33
#### New Features
44

src/core.c

Lines changed: 42 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)