ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/libecb/ecb.pod
(Generate patch)

Comparing cvsroot/libecb/ecb.pod (file contents):
Revision 1.84 by root, Mon Jan 20 21:10:16 2020 UTC vs.
Revision 1.95 by root, Sun Aug 1 10:00:33 2021 UTC

10 10
11Its homepage can be found here: 11Its homepage can be found here:
12 12
13 http://software.schmorp.de/pkg/libecb 13 http://software.schmorp.de/pkg/libecb
14 14
15It mainly provides a number of wrappers around GCC built-ins, together 15It mainly provides a number of wrappers around many compiler built-ins,
16with replacement functions for other compilers. In addition to this, 16together with replacement functions for other compilers. In addition
17it provides a number of other lowlevel C utilities, such as endianness 17to this, it provides a number of other lowlevel C utilities, such as
18detection, byte swapping or bit rotations. 18endianness detection, byte swapping or bit rotations.
19 19
20Or in other words, things that should be built into any standard C system, 20Or in other words, things that should be built into any standard C
21but aren't, implemented as efficient as possible with GCC, and still 21system, but aren't, implemented as efficient as possible with GCC (clang,
22correct with other compilers. 22msvc...), and still correct with other compilers.
23 23
24More might come. 24More might come.
25 25
26=head2 ABOUT THE HEADER 26=head2 ABOUT THE HEADER
27 27
80 80
81All the following symbols expand to an expression that can be tested in 81All the following symbols expand to an expression that can be tested in
82preprocessor instructions as well as treated as a boolean (use C<!!> to 82preprocessor instructions as well as treated as a boolean (use C<!!> to
83ensure it's either C<0> or C<1> if you need that). 83ensure it's either C<0> or C<1> if you need that).
84 84
85=over 4 85=over
86 86
87=item ECB_C 87=item ECB_C
88 88
89True if the implementation defines the C<__STDC__> macro to a true value, 89True if the implementation defines the C<__STDC__> macro to a true value,
90while not claiming to be C++, i..e C, but not C++. 90while not claiming to be C++, i..e C, but not C++.
163without having to think about format or endianness. 163without having to think about format or endianness.
164 164
165This is true for basically all modern platforms, although F<ecb.h> might 165This is true for basically all modern platforms, although F<ecb.h> might
166not be able to deduce this correctly everywhere and might err on the safe 166not be able to deduce this correctly everywhere and might err on the safe
167side. 167side.
168
169=item ECB_64BIT_NATIVE
170
171Evaluates to a true value (suitable for both preprocessor and C code
172testing) if 64 bit integer types on this architecture are evaluated
173"natively", that is, with similar speeds as 32 bit integers. While 64 bit
174integer support is very common (and in fact required by libecb), 32 bit
175cpus have to emulate operations on them, so you might want to avoid them.
168 176
169=item ECB_AMD64, ECB_AMD64_X32 177=item ECB_AMD64, ECB_AMD64_X32
170 178
171These two macros are defined to C<1> on the x86_64/amd64 ABI and the X32 179These two macros are defined to C<1> on the x86_64/amd64 ABI and the X32
172ABI, respectively, and undefined elsewhere. 180ABI, respectively, and undefined elsewhere.
179 187
180=back 188=back
181 189
182=head2 MACRO TRICKERY 190=head2 MACRO TRICKERY
183 191
184=over 4 192=over
185 193
186=item ECB_CONCAT (a, b) 194=item ECB_CONCAT (a, b)
187 195
188Expands any macros in C<a> and C<b>, then concatenates the result to form 196Expands any macros in C<a> and C<b>, then concatenates the result to form
189a single token. This is mainly useful to form identifiers from components, 197a single token. This is mainly useful to form identifiers from components,
230declarations must be put before the whole declaration: 238declarations must be put before the whole declaration:
231 239
232 ecb_const int mysqrt (int a); 240 ecb_const int mysqrt (int a);
233 ecb_unused int i; 241 ecb_unused int i;
234 242
235=over 4 243=over
236 244
237=item ecb_unused 245=item ecb_unused
238 246
239Marks a function or a variable as "unused", which simply suppresses a 247Marks a function or a variable as "unused", which simply suppresses a
240warning by GCC when it detects it as unused. This is useful when you e.g. 248warning by the compiler when it detects it as unused. This is useful when
241declare a variable but do not always use it: 249you e.g. declare a variable but do not always use it:
242 250
243 { 251 {
244 ecb_unused int var; 252 ecb_unused int var;
245 253
246 #ifdef SOMECONDITION 254 #ifdef SOMECONDITION
414 422
415=back 423=back
416 424
417=head2 OPTIMISATION HINTS 425=head2 OPTIMISATION HINTS
418 426
419=over 4 427=over
420 428
421=item bool ecb_is_constant (expr) 429=item bool ecb_is_constant (expr)
422 430
423Returns true iff the expression can be deduced to be a compile-time 431Returns true iff the expression can be deduced to be a compile-time
424constant, and false otherwise. 432constant, and false otherwise.
581 589
582=back 590=back
583 591
584=head2 BIT FIDDLING / BIT WIZARDRY 592=head2 BIT FIDDLING / BIT WIZARDRY
585 593
586=over 4 594=over
587 595
588=item bool ecb_big_endian () 596=item bool ecb_big_endian ()
589 597
590=item bool ecb_little_endian () 598=item bool ecb_little_endian ()
591 599
723 731
724=item uint64_t ecb_rotr64 (uint64_t x, unsigned int count) 732=item uint64_t ecb_rotr64 (uint64_t x, unsigned int count)
725 733
726These two families of functions return the value of C<x> after rotating 734These two families of functions return the value of C<x> after rotating
727all the bits by C<count> positions to the right (C<ecb_rotr>) or left 735all the bits by C<count> positions to the right (C<ecb_rotr>) or left
728(C<ecb_rotl>). 736(C<ecb_rotl>). There are no restrictions on the value C<count>, i.e. both
737zero and values equal or larger than the word width work correctly. Also,
738notwithstanding C<count> being unsigned, negative numbers work and shift
739to the opposite direction.
729 740
730Current GCC versions understand these functions and usually compile them 741Current GCC/clang versions understand these functions and usually compile
731to "optimal" code (e.g. a single C<rol> or a combination of C<shld> on 742them to "optimal" code (e.g. a single C<rol> or a combination of C<shld>
732x86). 743on x86).
733 744
734=item T ecb_rotl (T x, unsigned int count) [C++] 745=item T ecb_rotl (T x, unsigned int count) [C++]
735 746
736=item T ecb_rotr (T x, unsigned int count) [C++] 747=item T ecb_rotr (T x, unsigned int count) [C++]
737 748
741 752
742=back 753=back
743 754
744=head2 HOST ENDIANNESS CONVERSION 755=head2 HOST ENDIANNESS CONVERSION
745 756
746=over 4 757=over
747 758
748=item uint_fast16_t ecb_be_u16_to_host (uint_fast16_t v) 759=item uint_fast16_t ecb_be_u16_to_host (uint_fast16_t v)
749 760
750=item uint_fast32_t ecb_be_u32_to_host (uint_fast32_t v) 761=item uint_fast32_t ecb_be_u32_to_host (uint_fast32_t v)
751 762
779 790
780=back 791=back
781 792
782In C++ the following additional template functions are supported: 793In C++ the following additional template functions are supported:
783 794
784=over 4 795=over
785 796
786=item T ecb_be_to_host (T v) 797=item T ecb_be_to_host (T v)
787 798
788=item T ecb_le_to_host (T v) 799=item T ecb_le_to_host (T v)
789 800
790=item T ecb_host_to_be (T v) 801=item T ecb_host_to_be (T v)
791 802
792=item T ecb_host_to_le (T v) 803=item T ecb_host_to_le (T v)
804
805=back
793 806
794These functions work like their C counterparts, above, but use templates, 807These functions work like their C counterparts, above, but use templates,
795which make them useful in generic code. 808which make them useful in generic code.
796 809
797C<T> must be one of C<uint8_t>, C<uint16_t>, C<uint32_t> or C<uint64_t> 810C<T> must be one of C<uint8_t>, C<uint16_t>, C<uint32_t> or C<uint64_t>
800 813
801=head2 UNALIGNED LOAD/STORE 814=head2 UNALIGNED LOAD/STORE
802 815
803These function load or store unaligned multi-byte values. 816These function load or store unaligned multi-byte values.
804 817
805=over 4 818=over
806 819
807=item uint_fast16_t ecb_peek_u16_u (const void *ptr) 820=item uint_fast16_t ecb_peek_u16_u (const void *ptr)
808 821
809=item uint_fast32_t ecb_peek_u32_u (const void *ptr) 822=item uint_fast32_t ecb_peek_u32_u (const void *ptr)
810 823
854 867
855=back 868=back
856 869
857In C++ the following additional template functions are supported: 870In C++ the following additional template functions are supported:
858 871
859=over 4 872=over
860 873
861=item T ecb_peek<T> (const void *ptr) 874=item T ecb_peek<T> (const void *ptr)
862 875
863=item T ecb_peek_be<T> (const void *ptr) 876=item T ecb_peek_be<T> (const void *ptr)
864 877
906(C<uint8_t>) and also have an aligned version (without the C<_u> prefix), 919(C<uint8_t>) and also have an aligned version (without the C<_u> prefix),
907all of which hopefully makes them more useful in generic code. 920all of which hopefully makes them more useful in generic code.
908 921
909=back 922=back
910 923
924=head2 FAST INTEGER TO STRING
925
926Libecb defines a set of very fast integer to decimal string (or integer
927to ascii, short C<i2a>) functions. These work by converting the integer
928to a fixed point representation and then successively multiplying out
929the topmost digits. Unlike some other, also very fast, libraries, ecb's
930algorithm should be completely branchless per digit, and does not rely on
931the presence of special cpu functions (such as clz).
932
933There is a high level API that takes an C<int32_t>, C<uint32_t>,
934C<int64_t> or C<uint64_t> as argument, and a low-level API, which is
935harder to use but supports slightly more formatting options.
936
937=head3 HIGH LEVEL API
938
939The high level API consists of four functions, one each for C<int32_t>,
940C<uint32_t>, C<int64_t> and C<uint64_t>:
941
942Example:
943
944 char buf[ECB_I2A_MAX_DIGITS + 1];
945 char *end = ecb_i2a_i32 (buf, 17262);
946 *end = 0;
947 // buf now contains "17262"
948
949=over
950
951=item ECB_I2A_I32_DIGITS (=11)
952
953=item char *ecb_i2a_u32 (char *ptr, uint32_t value)
954
955Takes an C<uint32_t> I<value> and formats it as a decimal number starting
956at I<ptr>, using at most C<ECB_I2A_I32_DIGITS> characters. Returns a
957pointer to just after the generated string, where you would normally put
958the terminating C<0> character. This function outputs the minimum number
959of digits.
960
961=item ECB_I2A_U32_DIGITS (=10)
962
963=item char *ecb_i2a_i32 (char *ptr, int32_t value)
964
965Same as C<ecb_i2a_u32>, but formats a C<int32_t> value, including a minus
966sign if needed.
967
968=item ECB_I2A_I64_DIGITS (=20)
969
970=item char *ecb_i2a_u64 (char *ptr, uint64_t value)
971
972=item ECB_I2A_U64_DIGITS (=21)
973
974=item char *ecb_i2a_i64 (char *ptr, int64_t value)
975
976Similar to their 32 bit counterparts, these take a 64 bit argument.
977
978=item ECB_I2A_MAX_DIGITS (=21)
979
980Instead of using a type specific length macro, youi can just use
981C<ECB_I2A_MAX_DIGITS>, which is good enough for any C<ecb_i2a> function.
982
983=back
984
985=head3 LOW-LEVEL API
986
987The functions above use a number of low-level APIs which have some strict
988limitations, but can be used as building blocks (study of C<ecb_i2a_i32>
989and related functions is recommended).
990
991There are three families of functions: functions that convert a number
992to a fixed number of digits with leading zeroes (C<ecb_i2a_0N>, C<0>
993for "leading zeroes"), functions that generate up to N digits, skipping
994leading zeroes (C<_N>), and functions that can generate more digits, but
995the leading digit has limited range (C<_xN>).
996
997None of the functions deal with negative numbers.
998
999Example: convert an IP address in an u32 into dotted-quad:
1000
1001 uint32_t ip = 0x0a000164; // 10.0.1.100
1002 char ips[3 * 4 + 3 + 1];
1003 char *ptr = ips;
1004 ptr = ecb_i2a_3 (ptr, ip >> 24 ); *ptr++ = '.';
1005 ptr = ecb_i2a_3 (ptr, (ip >> 16) & 0xff); *ptr++ = '.';
1006 ptr = ecb_i2a_3 (ptr, (ip >> 8) & 0xff); *ptr++ = '.';
1007 ptr = ecb_i2a_3 (ptr, ip & 0xff); *ptr++ = 0;
1008 printf ("ip: %s\n", ips); // prints "ip: 10.0.1.100"
1009
1010=over
1011
1012=item char *ecb_i2a_02 (char *ptr, uint32_t value) // 32 bit
1013
1014=item char *ecb_i2a_03 (char *ptr, uint32_t value) // 32 bit
1015
1016=item char *ecb_i2a_04 (char *ptr, uint32_t value) // 32 bit
1017
1018=item char *ecb_i2a_05 (char *ptr, uint32_t value) // 64 bit
1019
1020=item char *ecb_i2a_06 (char *ptr, uint32_t value) // 64 bit
1021
1022=item char *ecb_i2a_07 (char *ptr, uint32_t value) // 64 bit
1023
1024=item char *ecb_i2a_08 (char *ptr, uint32_t value) // 64 bit
1025
1026=item char *ecb_i2a_09 (char *ptr, uint32_t value) // 64 bit
1027
1028The C<< ecb_i2a_0I<N> > functions take an unsigned I<value> and convert
1029them to exactly I<N> digits, returning a pointer to the first character
1030after the digits. The I<value> must be in range. The functions marked with
1031I<32 bit> do their calculations internally in 32 bit, the ones marked with
1032I<64 bit> internally use 64 bit integers, which might be slow on 32 bit
1033architectures (the high level API decides on 32 vs. 64 bit versions using
1034C<ECB_64BIT_NATIVE>).
1035
1036=item char *ecb_i2a_2 (char *ptr, uint32_t value) // 32 bit
1037
1038=item char *ecb_i2a_3 (char *ptr, uint32_t value) // 32 bit
1039
1040=item char *ecb_i2a_4 (char *ptr, uint32_t value) // 32 bit
1041
1042=item char *ecb_i2a_5 (char *ptr, uint32_t value) // 64 bit
1043
1044=item char *ecb_i2a_6 (char *ptr, uint32_t value) // 64 bit
1045
1046=item char *ecb_i2a_7 (char *ptr, uint32_t value) // 64 bit
1047
1048=item char *ecb_i2a_8 (char *ptr, uint32_t value) // 64 bit
1049
1050=item char *ecb_i2a_9 (char *ptr, uint32_t value) // 64 bit
1051
1052Similarly, the C<< ecb_i2a_I<N> > functions take an unsigned I<value>
1053and convert them to at most I<N> digits, suppressing leading zeroes, and
1054returning a pointer to the first character after the digits.
1055
1056=item ECB_I2A_MAX_X5 (=59074)
1057
1058=item char *ecb_i2a_x5 (char *ptr, uint32_t value) // 32 bit
1059
1060=item ECB_I2A_MAX_X10 (=2932500665)
1061
1062=item char *ecb_i2a_x10 (char *ptr, uint32_t value) // 64 bit
1063
1064The C<< ecb_i2a_xI<N> >> functions are similar to the C<< ecb_i2a_I<N> >
1065functions, but they can generate one digit more, as long as the number
1066is within range, which is given by the symbols C<ECB_I2A_MAX_X5> (almost
106716 bit range) and C<ECB_I2A_MAX_X10> (a bit more than 31 bit range),
1068respectively.
1069
1070For example, the digit part of a 32 bit signed integer just fits into the
1071C<ECB_I2A_MAX_X10> range, so while C<ecb_i2a_x10> cannot convert a 10
1072digit number, it can convert all 32 bit signed numbers. Sadly, it's not
1073good enough for 32 bit unsigned numbers.
1074
1075=back
1076
911=head2 FLOATING POINT FIDDLING 1077=head2 FLOATING POINT FIDDLING
912 1078
913=over 4 1079=over
914 1080
915=item ECB_INFINITY [-UECB_NO_LIBM] 1081=item ECB_INFINITY [-UECB_NO_LIBM]
916 1082
917Evaluates to positive infinity if supported by the platform, otherwise to 1083Evaluates to positive infinity if supported by the platform, otherwise to
918a truly huge number. 1084a truly huge number.
996 1162
997=back 1163=back
998 1164
999=head2 ARITHMETIC 1165=head2 ARITHMETIC
1000 1166
1001=over 4 1167=over
1002 1168
1003=item x = ecb_mod (m, n) 1169=item x = ecb_mod (m, n)
1004 1170
1005Returns C<m> modulo C<n>, which is the same as the positive remainder 1171Returns C<m> modulo C<n>, which is the same as the positive remainder
1006of the division operation between C<m> and C<n>, using floored 1172of the division operation between C<m> and C<n>, using floored
1013C<n> must be strictly positive (i.e. C<< >= 1 >>), while C<m> must be 1179C<n> must be strictly positive (i.e. C<< >= 1 >>), while C<m> must be
1014negatable, that is, both C<m> and C<-m> must be representable in its 1180negatable, that is, both C<m> and C<-m> must be representable in its
1015type (this typically excludes the minimum signed integer value, the same 1181type (this typically excludes the minimum signed integer value, the same
1016limitation as for C</> and C<%> in C). 1182limitation as for C</> and C<%> in C).
1017 1183
1018Current GCC versions compile this into an efficient branchless sequence on 1184Current GCC/clang versions compile this into an efficient branchless
1019almost all CPUs. 1185sequence on almost all CPUs.
1020 1186
1021For example, when you want to rotate forward through the members of an 1187For example, when you want to rotate forward through the members of an
1022array for increasing C<m> (which might be negative), then you should use 1188array for increasing C<m> (which might be negative), then you should use
1023C<ecb_mod>, as the C<%> operator might give either negative results, or 1189C<ecb_mod>, as the C<%> operator might give either negative results, or
1024change direction for negative values: 1190change direction for negative values:
1037 1203
1038=back 1204=back
1039 1205
1040=head2 UTILITY 1206=head2 UTILITY
1041 1207
1042=over 4 1208=over
1043 1209
1044=item element_count = ecb_array_length (name) 1210=item element_count = ecb_array_length (name)
1045 1211
1046Returns the number of elements in the array C<name>. For example: 1212Returns the number of elements in the array C<name>. For example:
1047 1213
1055 1221
1056=head2 SYMBOLS GOVERNING COMPILATION OF ECB.H ITSELF 1222=head2 SYMBOLS GOVERNING COMPILATION OF ECB.H ITSELF
1057 1223
1058These symbols need to be defined before including F<ecb.h> the first time. 1224These symbols need to be defined before including F<ecb.h> the first time.
1059 1225
1060=over 4 1226=over
1061 1227
1062=item ECB_NO_THREADS 1228=item ECB_NO_THREADS
1063 1229
1064If F<ecb.h> is never used from multiple threads, then this symbol can 1230If F<ecb.h> is never used from multiple threads, then this symbol can
1065be defined, in which case memory fences (and similar constructs) are 1231be defined, in which case memory fences (and similar constructs) are

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines