diff options
author | Sverker Eriksson <[email protected]> | 2014-01-21 12:21:11 +0100 |
---|---|---|
committer | Björn-Egil Dahlberg <[email protected]> | 2014-01-29 11:08:49 +0100 |
commit | bc34b5dafaebf07d7185900310246f5752c0a6c4 (patch) | |
tree | 3e2791a4aaa8171c9033e829148dbce9e24db3a0 /erts/emulator/beam/erl_map.c | |
parent | fa92c876756032bc7f824ed81bb9ba4667f14805 (diff) | |
download | otp-bc34b5dafaebf07d7185900310246f5752c0a6c4.tar.gz otp-bc34b5dafaebf07d7185900310246f5752c0a6c4.tar.bz2 otp-bc34b5dafaebf07d7185900310246f5752c0a6c4.zip |
erts: Add map construction to driver API
erl_drv_output_term() and erl_drv_send_term() can send messages
containing maps with the use of the new ERL_DRV_MAP.
The driver API minor version is updated as new functionality is added.
Diffstat (limited to 'erts/emulator/beam/erl_map.c')
-rw-r--r-- | erts/emulator/beam/erl_map.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_map.c b/erts/emulator/beam/erl_map.c index 57f156509c..2fff7f9390 100644 --- a/erts/emulator/beam/erl_map.c +++ b/erts/emulator/beam/erl_map.c @@ -786,3 +786,34 @@ BIF_RETTYPE maps_values_1(BIF_ALIST_1) { } BIF_ERROR(BIF_P, BADARG); } + +int erts_validate_and_sort_map(map_t* mp) +{ + Eterm *ks = map_get_keys(mp); + Eterm *vs = map_get_values(mp); + Uint sz = map_get_size(mp); + Uint ix,jx; + Eterm tmp; + int c; + + /* sort */ + + for (ix = 1; ix < sz; ix++) { + jx = ix; + while( jx > 0 && (c = CMP_TERM(ks[jx],ks[jx-1])) <= 0 ) { + /* identical key -> error */ + if (c == 0) return 0; + + tmp = ks[jx]; + ks[jx] = ks[jx - 1]; + ks[jx - 1] = tmp; + + tmp = vs[jx]; + vs[jx] = vs[jx - 1]; + vs[jx - 1] = tmp; + + jx--; + } + } + return 1; +} |