|Tollos – tollosUtil.c|
tollosUtil.c – useful macros and functions for Tollos
The macros are defined in tollosUtil.h, and are:
abs(x) – return the absolute value of x
deg2rad(d) – degrees to radians
iswap(x,y) – swap the values of the ints x and y using XOR
max(a,b) – return the larger of x and y
min(a,b) – return the smaller of x and y
rad2deg(r) – radians to degrees
signum(x) – return the sign of x (−1, 0, or 1)
The functions have various purposes.
byte2hex – convert a byte to two hex chars
void byte2hex(byte b, char *hex, flag upper);
b – byte to convert
hex – points to where ASCII bytes should go
upper – 1 to use ABCDEF, 0 for abcdef
This writes only the two characters; no terminating zero char is added. No error is possible.
fastrand – return a random number in the range 0 to n−1
int fastrand(uint n, uint *seed);
n – defines the random number range
seed – static or persistent seed
returns the pseudo-random number
n should be <30,000,000; the seed is provided by the caller initially but should not then be altered by the caller.
This uses the conventional X(n+1)=mod((A*X(n) + C),M) as used in the Rexx function package, but without some refinements.
The values for A and M are from the table in D.E.Knuth’s book, “Seminumerical Algorithms”, Addison-Wesley, 1981, page 102 (section 3.3.2). These particular values are attributed to Lavaux and Janssens.
hex2byte – convert two hexadecimal characters to a byte
int hex2byte(char *hex, byte *b);
hex – points to two ASCII bytes
b – points to byte which will receive the converted hexadecimal; set to 0x00 if error
returns 0 if OK, −1 if error
This accepts both uppercase and lowercase A->F and a->f.
isqrtg – return the square root of an int, with guess
int isqrtg(int num, int guess);
num – the number to square root
guess – is the number to converge from (e.g., last similar result); if < 1, isqrtg will make the first guess
returns the integer square root of num, such that result*result < num; if num is less than zero then 0 is returned
Note: the maximum input value is 2**31−1 (2147483647) hence the maximum possible returned value is 46340.
i2str – layout an integer as a string
int i2str(char *string, int num, int len);
string – where to layout the integer
num – the integer to lay out (not 0x80000000)
len – width of the field (string) to lay out into
returns 0 if OK, 1 if overflow (does not fit)
This writes num right-aligned and signed in the string field. No terminating zero char is written.
nop – do nothing with an int
int nop(int i);
i – an integer
This is used for placating compilers when parameters are intentionally or temporarily unused.
streq – caseless string compare
int streq(const char *char1, const char *char2);
char1 – first string to compare
char2 – second string
returns 1 if the strings caseless-compare equal, 0 otherwise
If both strings are empty they are equal.
strf – a reentrant mini printf to send a formatted string
int strf(putter putC, const char *format, va_list args);
putC – the function to which to send formatted characters
format – format and data string
args – list of other arguments as required
returns the number (count) of characters sent
The following format indicators are supported:
%% – ‘%’
%c – single char
%d, i – signed int
%m – minidec decimal number [iff MINIDEC is defined]
%s – string
%u – unsigned int
%x, X – hexadecimal
%\n – LF only (otherwise \n becomes CRLF)
The five printf format flags (+ - 0 # and space) are supported for all formats as in C99 (e.g., # only affects ‘x’, here).
The ‘h’, ‘l’, and ‘L’ modifiers are not supported.
Field width (e.g., %10i, %08x) is supported for all formats.
Field precision (e.g., %5.7i) is not supported; for decimals, use Quantize on a number to set its ‘precision’.
A \n in the string is expanded to \r\n unless preceded by %.
Almost no error checking is carried out, so, for example, the flags and field width can be used even if the format character is not one of those listed; the format character then appears in the output.
|Tollos and these web pages were written by Mike Cowlishaw; Please send me any corrections, suggestions, etc.|
All content © Mike Cowlishaw, 2010–2012, except where marked
otherwise. All rights reserved. The pages here are for non-commercial
use only (see the separate licence for Tollos source code).
records no personal information and sets no ‘cookies’.
However, statistics, etc. might be recorded by the web hosting
This page was last updated on 2011-11-18 by c2wiki.