<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: c code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Fri, 25 Jul 2008 07:24:23 GMT</pubDate>
    <description>DZone Snippets: c code</description>
    <item>
      <title>Disk/flash benchmark</title>
      <link>http://snippets.dzone.com/posts/show/5821</link>
      <description>Adapted from a LKML posted program. I think I added write support, this for benchmarking random access writes on flash.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/* Simple multi-threaded I/O benchmark program.&lt;br /&gt; * Copyright (C) Michael Tokarev, mjt@tls.msk.ru&lt;br /&gt; * Public domain.&lt;br /&gt; *&lt;br /&gt; * To compile:&lt;br /&gt; *   gcc -o iot iot.c -lpthread&lt;br /&gt; * To run:&lt;br /&gt; *   Either with disk device or with pre-existing file.&lt;br /&gt; *    ./iot [options] filename&lt;br /&gt; *   Filename is the file or device to test on.&lt;br /&gt; *   By default it uses 8Kb I/O blocks and does sequential read test&lt;br /&gt; *   until interrupted.&lt;br /&gt; *   To indicate when to stop:&lt;br /&gt; *     -t sec - run for this many seconds, say, 30, to eliminate random&lt;br /&gt; *       noise.&lt;br /&gt; *     -i num - perform this many I/O operations&lt;br /&gt; *   To indicate R/W mode:&lt;br /&gt; *     -wn, -Wn, -rn, -Rn --&lt;br /&gt; *       perform linear or random write (note: all data will be lost!),&lt;br /&gt; *       or linear or random read, using given number of threads (n).&lt;br /&gt; *   I/O modes:&lt;br /&gt; *    -s - syncronous write (O_SYNC)&lt;br /&gt; *    -d - direct I/O (O_DIRECT)&lt;br /&gt; *    -b bs - block size in bytes&lt;br /&gt; *   And finally:&lt;br /&gt; *    -h - display usage.&lt;br /&gt; * Example:&lt;br /&gt; *   ./iot -t30 -W4 -R4 -d -b8192 /dev/sdb&lt;br /&gt; * perform random read/write test (4 readers and 4 writers)&lt;br /&gt; * for 30 seconds using direct I/O and block size of 8Kb.&lt;br /&gt; *&lt;br /&gt; * Note: for small blocksize (&lt;64Kb at least) and using direct random I/O,&lt;br /&gt; * nowadays drives sometimes gives transfer rates below 1Mb/sec - this is&lt;br /&gt; * expectable, don't be afraid of so low numbers.  The reason is simple:&lt;br /&gt; * in order to access a given block of data, a disk drive has to seek to the&lt;br /&gt; * right track (average seek time) and wait for the right sector to be near&lt;br /&gt; * the head (rotation latency).  Sum up the two, and divide 1 sec to the&lt;br /&gt; * result -- you'll have max number of requests/sec a drive can perform,&lt;br /&gt; * not counting the actual data transfer (which reduces this number further).&lt;br /&gt; * With, say, 5ms seek time + rotation latency, we'll have 200 requests/sec,&lt;br /&gt; * which, with 4Kb request size, will be about 800Kb/sec - which is below&lt;br /&gt; * 1Mb/sec, not counting the actual transfer...&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;#define _GNU_SOURCE&lt;br /&gt;#define _BSD_SOURCE&lt;br /&gt;#define _LARGEFILE_SOURCE&lt;br /&gt;#define _FILE_OFFSET_BITS 64&lt;br /&gt;&lt;br /&gt;//#define USE_DEV_URANDOM       /* was not a good idea */&lt;br /&gt;&lt;br /&gt;#include &lt;sys/types.h&gt;&lt;br /&gt;#include &lt;unistd.h&gt;&lt;br /&gt;#include &lt;fcntl.h&gt;&lt;br /&gt;#include &lt;errno.h&gt;&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;sys/time.h&gt;&lt;br /&gt;#include &lt;sys/ioctl.h&gt;&lt;br /&gt;#include &lt;signal.h&gt;&lt;br /&gt;#include &lt;pthread.h&gt;&lt;br /&gt;#include &lt;string.h&gt;&lt;br /&gt;&lt;br /&gt;#ifndef BLKGETSIZE64&lt;br /&gt;#define BLKGETSIZE64 _IOR(0x12,114,size_t)&lt;br /&gt; /* linux-specific. return device size in bytes (u64 *arg) */&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;static void edie(const char *what) {&lt;br /&gt;  fprintf(stderr, "%s: %m \n", what);&lt;br /&gt;  exit(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#ifdef USE_DEV_URANDOM&lt;br /&gt;static int randfd;&lt;br /&gt;#endif&lt;br /&gt;static int oflags;              // open flags&lt;br /&gt;static char *fn;                // filename&lt;br /&gt;static unsigned bs = 8192;      // block size&lt;br /&gt;static unsigned bc;             // block count (device size in blocks)&lt;br /&gt;static unsigned bm;             // blocks to do&lt;br /&gt;&lt;br /&gt;#define MFrnd   1&lt;br /&gt;#define MFwrt   2&lt;br /&gt;#define LinRd   0&lt;br /&gt;#define RndRd   MFrnd&lt;br /&gt;#define LinWr   MFwrt&lt;br /&gt;#define RndWr   (MFrnd|MFwrt)&lt;br /&gt;&lt;br /&gt;struct state {&lt;br /&gt;  int fd;&lt;br /&gt;  char *buf;&lt;br /&gt;  unsigned ioc;         // I/O count&lt;br /&gt;  int (*workfn)(struct state *, unsigned blocknr);&lt;br /&gt;  unsigned (*posfn)(struct state *s);&lt;br /&gt;  unsigned opi;         // operation index&lt;br /&gt;  unsigned i;           // curidx&lt;br /&gt;  double stime;         // start time&lt;br /&gt;  unsigned bn;          // current block number for linear i/o&lt;br /&gt;};&lt;br /&gt;static unsigned int alternate;&lt;br /&gt;static unsigned tioc;   // total i/o count&lt;br /&gt;static struct state *states;&lt;br /&gt;static unsigned nt[4];&lt;br /&gt;static unsigned ntt;&lt;br /&gt;static volatile unsigned running;&lt;br /&gt;static const char *const ion[4] = { "LinRd", "RndRd", "LinWr", "RndWr" };&lt;br /&gt;&lt;br /&gt;static pthread_mutex_t rnmtx = PTHREAD_MUTEX_INITIALIZER;&lt;br /&gt;static pthread_cond_t rncond = PTHREAD_COND_INITIALIZER;&lt;br /&gt;&lt;br /&gt;static double curtime(void) {&lt;br /&gt;  struct timeval tv;&lt;br /&gt;  gettimeofday(&amp;tv, NULL);&lt;br /&gt;  return tv.tv_sec + tv.tv_usec / 1000000.0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static unsigned randpos(struct state *s) {&lt;br /&gt;  unsigned n;&lt;br /&gt;#ifdef USE_DEV_URANDOM&lt;br /&gt;  read(randfd, &amp;n, sizeof(n));&lt;br /&gt;#else&lt;br /&gt;  n = lrand48();&lt;br /&gt;#endif&lt;br /&gt;  s = s;&lt;br /&gt;  if(alternate == 1) {&lt;br /&gt;    if(n &gt; bc/2) {&lt;br /&gt;      return bc-1;&lt;br /&gt;    } else {&lt;br /&gt;      return 0;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  return n % bc;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static unsigned linpos(struct state *s) {&lt;br /&gt;  if (s-&gt;bn &gt;= bc)&lt;br /&gt;    s-&gt;bn = 0;&lt;br /&gt;  return s-&gt;bn++;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static int wwriter(struct state *s, unsigned b) {&lt;br /&gt;  return pwrite(s-&gt;fd, s-&gt;buf, bs, (off_t)b * bs);&lt;br /&gt;}&lt;br /&gt;static int wreader(struct state *s, unsigned b) {&lt;br /&gt;  return pread(s-&gt;fd, s-&gt;buf, bs, (off_t)b * bs);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void pst(FILE *f) {&lt;br /&gt;  double ct = curtime();&lt;br /&gt;  double r[4] = { 0, 0, 0, 0 };&lt;br /&gt;  unsigned c[4] = { 0, 0, 0, 0 };&lt;br /&gt;  unsigned i;&lt;br /&gt;  double d;&lt;br /&gt;  for(i = 0; i &lt; ntt; ++i) {&lt;br /&gt;    d = ct - states[i].stime;&lt;br /&gt;    r[states[i].opi] += states[i].ioc / d;&lt;br /&gt;    c[states[i].opi] += states[i].ioc;&lt;br /&gt;  }&lt;br /&gt;#if 1&lt;br /&gt;  for(i = 0; i &lt; 4; ++i)&lt;br /&gt;    if (c[i])&lt;br /&gt;      fprintf(f, " %s %u %.2f", ion[i], c[i], r[i] * bs / 1024 / 1024);&lt;br /&gt;#endif&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void incc() {&lt;br /&gt;  if (!(++tioc % 1000))&lt;br /&gt;    pthread_cond_signal(&amp;rncond);&lt;br /&gt;}&lt;br /&gt;static void decnr() {&lt;br /&gt;  pthread_mutex_lock(&amp;rnmtx);&lt;br /&gt;  --running;&lt;br /&gt;  pthread_mutex_unlock(&amp;rnmtx);&lt;br /&gt;  pthread_cond_broadcast(&amp;rncond);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static volatile int term;&lt;br /&gt;&lt;br /&gt;void *worker(void *arg) {&lt;br /&gt;  struct state *s = arg;&lt;br /&gt;  s-&gt;workfn = s-&gt;opi &amp; MFwrt ? wwriter : wreader;&lt;br /&gt;  s-&gt;posfn  = s-&gt;opi &amp; MFrnd ? randpos : linpos;&lt;br /&gt;  s-&gt;fd = open(fn, (s-&gt;opi &amp; MFwrt ? O_WRONLY : O_RDONLY) | oflags);&lt;br /&gt;  if (s-&gt;fd &lt; 0) {&lt;br /&gt;    int e = errno;&lt;br /&gt;    decnr();&lt;br /&gt;    errno = e;&lt;br /&gt;    edie(fn);&lt;br /&gt;  }&lt;br /&gt;  s-&gt;stime = curtime();&lt;br /&gt;  for(;;) {&lt;br /&gt;    if (term) break;&lt;br /&gt;    if (s-&gt;workfn(s, s-&gt;posfn(s)) &lt; 0) {&lt;br /&gt;      perror(ion[s-&gt;opi]);&lt;br /&gt;      break;&lt;br /&gt;    }&lt;br /&gt;    ++s-&gt;ioc;&lt;br /&gt;    incc();&lt;br /&gt;    if (bm &amp;&amp; s-&gt;ioc &gt;= bm) break;&lt;br /&gt;  }&lt;br /&gt;  decnr();&lt;br /&gt;  return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void sig(int s) {&lt;br /&gt;  term = s;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char **argv) {&lt;br /&gt;  int c;&lt;br /&gt;  unsigned i, j;&lt;br /&gt;  unsigned tm = 0;&lt;br /&gt;  struct state *s;&lt;br /&gt;  char *buf;&lt;br /&gt;  struct timeval  first,&lt;br /&gt;                second,&lt;br /&gt;                lapsed;&lt;br /&gt;&lt;br /&gt;  while((c = getopt(argc, argv, "r::R::w::W::adsb:n:i:t:h")) != EOF) switch(c) {&lt;br /&gt;  case 'r': nt[LinRd] = optarg ? atoi(optarg) : 1; break;&lt;br /&gt;  case 'R': nt[RndRd] = optarg ? atoi(optarg) : 1; break;&lt;br /&gt;  case 'w': nt[LinWr] = optarg ? atoi(optarg) : 1; break;&lt;br /&gt;  case 'W': nt[RndWr] = optarg ? atoi(optarg) : 1; break;&lt;br /&gt;  case 'd': oflags |= O_DIRECT; break;&lt;br /&gt;  case 's': oflags |= O_SYNC; break;&lt;br /&gt;  case 'b': bs = atoi(optarg); break;&lt;br /&gt;  case 'n': bc = atoi(optarg); break;&lt;br /&gt;  case 'i': bm = atoi(optarg); break;&lt;br /&gt;  case 't': tm = atoi(optarg); break;&lt;br /&gt;  case 'a': alternate = 1; break;&lt;br /&gt;  case 'h':&lt;br /&gt;    puts(&lt;br /&gt;"iotest: perform I/O speed test\n"&lt;br /&gt;"Usage is: iotest [options] device-or-file\n"&lt;br /&gt;"options:\n"&lt;br /&gt;" -r[n] - linear read test (n readers)\n"&lt;br /&gt;" -R[n] - random read test (n readers)\n"&lt;br /&gt;" -w[n] - linear write test (n writers)\n"&lt;br /&gt;" -W[n] - random write test (n writers)\n"&lt;br /&gt;" -d - use direct I/O (O_DIRECT)\n"&lt;br /&gt;" -s - use syncronous I/O (O_SYNC)\n"&lt;br /&gt;" -b bs - blocksize (default is 8192)\n"&lt;br /&gt;" -n bc - block count (default is whole device/file)\n"&lt;br /&gt;" -i nb - number of I/O iterations to perform\n"&lt;br /&gt;" -t sec - time to spend on all I/O\n"&lt;br /&gt;" -h - this help\n"&lt;br /&gt;"It's ok to specify all, one or some of -r,-R,-w and -W\n"&lt;br /&gt;);&lt;br /&gt;    return 0;&lt;br /&gt;  default: fprintf(stderr, "try `iotest -h' for help\n"); exit(1);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if (optind + 1 != argc) {&lt;br /&gt;    fprintf(stderr, "exactly one device/file argument expected\n");&lt;br /&gt;    return 1;&lt;br /&gt;  }&lt;br /&gt;  fn = argv[optind];&lt;br /&gt;&lt;br /&gt;  ntt = nt[0] + nt[1] + nt[2] + nt[3];&lt;br /&gt;  if (!ntt)&lt;br /&gt;    nt[LinRd] = ntt = 1;&lt;br /&gt;&lt;br /&gt;  c = open(fn, (nt[LinWr] + nt[RndWr] ? O_RDWR : O_RDONLY) | oflags);&lt;br /&gt;  if (c &lt; 0) edie(fn);&lt;br /&gt;  if (!bc) {&lt;br /&gt;    unsigned long long sz;&lt;br /&gt;    struct stat st;&lt;br /&gt;    fstat(c, &amp;st);&lt;br /&gt;    if (st.st_size) sz = st.st_size;&lt;br /&gt;    else ioctl(c, BLKGETSIZE64, &amp;sz);&lt;br /&gt;    bc = sz / bs;&lt;br /&gt;    fprintf(stderr, "size = %lld (%u blocks)\n", sz, bc);&lt;br /&gt;  }&lt;br /&gt;  close(c);&lt;br /&gt;  if (nt[RndRd] || nt[RndWr]) {&lt;br /&gt;#ifdef USE_DEV_URANDOM&lt;br /&gt;    randfd = open("/dev/urandom", O_RDONLY);&lt;br /&gt;    if (randfd &lt; 0) edie("/dev/urandom");&lt;br /&gt;#else&lt;br /&gt;#if 0&lt;br /&gt;    struct timeval tv;&lt;br /&gt;    gettimeofday(&amp;tv, NULL);&lt;br /&gt;    srand48(tv.tv_usec ^ getpid());&lt;br /&gt;#else&lt;br /&gt;    srand48(0xfeda432); // arbitrary, to get repeated values on repeated runs&lt;br /&gt;#endif&lt;br /&gt;#endif&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  gettimeofday(&amp;first, NULL);&lt;br /&gt;&lt;br /&gt;  states = calloc(ntt, sizeof(*states));&lt;br /&gt;  s = states;&lt;br /&gt;&lt;br /&gt;  buf = valloc(ntt * bs);&lt;br /&gt;  if (tm) {&lt;br /&gt;    signal(SIGALRM, sig);&lt;br /&gt;    alarm(tm);&lt;br /&gt;  }&lt;br /&gt;  running = ntt;&lt;br /&gt;  for(j = 0; j &lt; 4; ++j)&lt;br /&gt;    for(i = 0; i &lt; nt[j]; ++i) {&lt;br /&gt;      pthread_t t;&lt;br /&gt;      s-&gt;buf = buf; buf += bs;&lt;br /&gt;      s-&gt;opi = j;&lt;br /&gt;      s-&gt;i = i;&lt;br /&gt;      pthread_create(&amp;t, NULL, worker, s++);&lt;br /&gt;    }&lt;br /&gt;  while(running) {&lt;br /&gt;    pthread_cond_wait(&amp;rncond, &amp;rnmtx);&lt;br /&gt;    putc('\r', stderr);&lt;br /&gt;    pst(stderr);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  putc('\r', stderr);&lt;br /&gt;  pst(stdout);&lt;br /&gt;  putc('\n', stdout);&lt;br /&gt;&lt;br /&gt;  gettimeofday(&amp;second, NULL);&lt;br /&gt;&lt;br /&gt;  if (first.tv_usec &gt; second.tv_usec) {&lt;br /&gt;    second.tv_usec += 1000000;&lt;br /&gt;    second.tv_sec--;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  lapsed.tv_usec = second.tv_usec - first.tv_usec;&lt;br /&gt;  lapsed.tv_sec  = second.tv_sec  - first.tv_sec;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  if (nt[RndRd] || nt[RndWr]) {&lt;br /&gt;        printf("I/O latency: %f\n", (lapsed.tv_sec*1000+(lapsed.tv_usec/1000))/(float)tioc);&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 24 Jul 2008 16:50:04 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5821</guid>
      <author>sandos (John B&#228;ckstrand)</author>
    </item>
    <item>
      <title>sglib</title>
      <link>http://snippets.dzone.com/posts/show/5784</link>
      <description>&lt;code&gt;&lt;br /&gt;#ifndef _SGLIB__h_&lt;br /&gt;#define _SGLIB__h_&lt;br /&gt;&lt;br /&gt;/* the assert is used exclusively to write unexpected error messages */&lt;br /&gt;#include &lt;assert.h&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* ---------------------------------------------------------------------------- */&lt;br /&gt;/* ---------------------------------------------------------------------------- */&lt;br /&gt;/* -                            LEVEL - 0  INTERFACE                          - */&lt;br /&gt;/* ---------------------------------------------------------------------------- */&lt;br /&gt;/* ---------------------------------------------------------------------------- */&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* ---------------------------------------------------------------------------- */&lt;br /&gt;/* ------------------------------ STATIC ARRAYS ------------------------------- */&lt;br /&gt;/* ---------------------------------------------------------------------------- */&lt;br /&gt;&lt;br /&gt;/* &lt;br /&gt;&lt;br /&gt;  Basic algorithms  for sorting arrays. Multiple  depending arrays can&lt;br /&gt;  be rearranged using user defined 'elem_exchangers'&lt;br /&gt;&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;/*               HEAP - SORT  (level 0)           */&lt;br /&gt;&lt;br /&gt;#define SGLIB_ARRAY_SINGLE_HEAP_SORT(type, a, max, comparator) {\&lt;br /&gt;  SGLIB_ARRAY_HEAP_SORT(type, a, max, comparator, SGLIB_ARRAY_ELEMENTS_EXCHANGER);\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_ARRAY_HEAP_SORT(type, a, max, comparator, elem_exchanger) {\&lt;br /&gt;  int   _k_;\&lt;br /&gt;  for(_k_=(max)/2; _k_&gt;=0; _k_--) {\&lt;br /&gt;    SGLIB___ARRAY_HEAP_DOWN(type, a, _k_, max, comparator, elem_exchanger);\&lt;br /&gt;  }\&lt;br /&gt;  for(_k_=(max)-1; _k_&gt;=0; _k_--) {\&lt;br /&gt;    elem_exchanger(type, a, 0, _k_);\&lt;br /&gt;    SGLIB___ARRAY_HEAP_DOWN(type, a, 0, _k_, comparator, elem_exchanger);\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB___ARRAY_HEAP_DOWN(type, a, ind, max, comparator, elem_exchanger) {\&lt;br /&gt;  type  _t_;\&lt;br /&gt;  int   _m_, _l_, _r_, _i_;\&lt;br /&gt;  _i_ = (ind);\&lt;br /&gt;  _m_ = _i_;\&lt;br /&gt;  do {\&lt;br /&gt;    _i_ = _m_;          \&lt;br /&gt;    _l_ = 2*_i_+1;\&lt;br /&gt;    _r_ = _l_+1;\&lt;br /&gt;    if (_l_ &lt; (max)){\&lt;br /&gt;      if (comparator(((a)[_m_]), ((a)[_l_])) &lt; 0) _m_ = _l_;\&lt;br /&gt;      if (_r_ &lt; (max)) {\&lt;br /&gt;        if (comparator(((a)[_m_]), ((a)[_r_])) &lt; 0) _m_ = _r_;\&lt;br /&gt;      }\&lt;br /&gt;    }\&lt;br /&gt;    if (_m_ != _i_) {\&lt;br /&gt;     elem_exchanger(type, a, _i_, _m_);\&lt;br /&gt;    }\&lt;br /&gt;  } while (_m_ != _i_);\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*             QUICK - SORT   (level 0)          */&lt;br /&gt;&lt;br /&gt;#define SGLIB_ARRAY_SINGLE_QUICK_SORT(type, a, max, comparator) {\&lt;br /&gt;  SGLIB_ARRAY_QUICK_SORT(type, a, max, comparator, SGLIB_ARRAY_ELEMENTS_EXCHANGER);\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_ARRAY_QUICK_SORT(type, a, max, comparator, elem_exchanger) {\&lt;br /&gt;  int   _i_, _j_, _p_, _stacki_, _start_, _end_;\&lt;br /&gt;  /* can sort up to 2^64 elements */\&lt;br /&gt;  int   _startStack_[64]; \&lt;br /&gt;  int   _endStack_[64];\&lt;br /&gt;  type  _tmp_;\&lt;br /&gt;  _startStack_[0] = 0;\&lt;br /&gt;  _endStack_[0] = (max);\&lt;br /&gt;  _stacki_ = 1;\&lt;br /&gt;  while (_stacki_ &gt; 0) {\&lt;br /&gt;    _stacki_ --;\&lt;br /&gt;    _start_ = _startStack_[_stacki_];\&lt;br /&gt;    _end_ = _endStack_[_stacki_];\&lt;br /&gt;    while (_end_ - _start_ &gt; 2) {\&lt;br /&gt;      _p_ = _start_;\&lt;br /&gt;      _i_ = _start_ + 1;\&lt;br /&gt;      _j_ = _end_ - 1;\&lt;br /&gt;      while (_i_&lt;_j_) {\&lt;br /&gt;        for(; _i_&lt;=_j_ &amp;&amp; comparator(((a)[_i_]),((a)[_p_]))&lt;=0; _i_++) ;\&lt;br /&gt;        if (_i_ &gt; _j_) {\&lt;br /&gt;          /* all remaining elements lesseq than pivot */\&lt;br /&gt;          elem_exchanger(type, a, _j_, _p_);\&lt;br /&gt;          _i_ = _j_;\&lt;br /&gt;        } else {\&lt;br /&gt;          for(; _i_&lt;=_j_ &amp;&amp; comparator(((a)[_j_]),((a)[_p_]))&gt;=0; _j_--) ;\&lt;br /&gt;          if (_i_ &gt; _j_) {\&lt;br /&gt;            /* all remaining elements greater than pivot */\&lt;br /&gt;            elem_exchanger(type, a, _j_, _p_);\&lt;br /&gt;            _i_ = _j_;\&lt;br /&gt;          } else if (_i_ &lt; _j_) {\&lt;br /&gt;            elem_exchanger(type, a, _i_, _j_);\&lt;br /&gt;            if (_i_+2 &lt; _j_) {_i_++; _j_--;}\&lt;br /&gt;            else if (_i_+1 &lt; _j_) _i_++;\&lt;br /&gt;          }\&lt;br /&gt;        }\&lt;br /&gt;      }\&lt;br /&gt;      /* O.K. i==j and pivot is on a[i] == a[j] */\&lt;br /&gt;      /* handle recursive calls without recursion */\&lt;br /&gt;      if (_i_-_start_ &gt; 1 &amp;&amp; _end_-_j_ &gt; 1) {\&lt;br /&gt;        /* two recursive calls, use array-stack */\&lt;br /&gt;        if (_i_-_start_ &lt; _end_-_j_-1) {\&lt;br /&gt;          _startStack_[_stacki_] = _j_+1;\&lt;br /&gt;          _endStack_[_stacki_] = _end_;\&lt;br /&gt;          _stacki_ ++;\&lt;br /&gt;          _end_ = _i_;\&lt;br /&gt;        } else {\&lt;br /&gt;          _startStack_[_stacki_] = _start_;\&lt;br /&gt;          _endStack_[_stacki_] = _i_;\&lt;br /&gt;          _stacki_ ++;\&lt;br /&gt;          _start_ = _j_+1;\&lt;br /&gt;        }\&lt;br /&gt;      } else {\&lt;br /&gt;        if (_i_-_start_ &gt; 1) {\&lt;br /&gt;          _end_ = _i_;\&lt;br /&gt;        } else {\&lt;br /&gt;          _start_ = _j_+1;\&lt;br /&gt;        }\&lt;br /&gt;      }\&lt;br /&gt;    }\&lt;br /&gt;    if (_end_ - _start_ == 2) {\&lt;br /&gt;      if (comparator(((a)[_start_]),((a)[_end_-1])) &gt; 0) {\&lt;br /&gt;        elem_exchanger(type, a, _start_, _end_-1);\&lt;br /&gt;      }\&lt;br /&gt;    }\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*             BINARY SEARCH (level 0)          */&lt;br /&gt;&lt;br /&gt;#define SGLIB_ARRAY_BINARY_SEARCH(type, a, start_index, end_index, key, comparator, found, result_index) {\&lt;br /&gt;  int _kk_, _cc_, _ii_, _jj_, _ff_;\&lt;br /&gt;  _ii_ = (start_index); \&lt;br /&gt;  _jj_ = (end_index);\&lt;br /&gt;  _ff_ = 0;\&lt;br /&gt;  while (_ii_ &lt;= _jj_ &amp;&amp; _ff_==0) {\&lt;br /&gt;    _kk_ = (_jj_+_ii_)/2;\&lt;br /&gt;    _cc_ = comparator(((a)[_kk_]), (key));\&lt;br /&gt;    if (_cc_ == 0) {\&lt;br /&gt;      (result_index) = _kk_;    \&lt;br /&gt;      _ff_ = 1;\&lt;br /&gt;    } else if (_cc_ &lt; 0) {\&lt;br /&gt;      _ii_ = _kk_+1;\&lt;br /&gt;    } else {\&lt;br /&gt;      _jj_ = _kk_-1;\&lt;br /&gt;    }\&lt;br /&gt;  }\&lt;br /&gt;  if (_ff_ == 0) {\&lt;br /&gt;    /* not found, but set its resulting place in the array */\&lt;br /&gt;    (result_index) = _jj_+1;\&lt;br /&gt;  }\&lt;br /&gt;  (found) = _ff_;\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* -------------------------------- queue (in an array) ------------------ */&lt;br /&gt;/* queue is a quadruple (a,i,j,dim) such that:                             */&lt;br /&gt;/*  a is the array storing values                                          */&lt;br /&gt;/*  i is the index of the first used element in the array                  */&lt;br /&gt;/*  j is the index of the first free element in the array                  */&lt;br /&gt;/*  dim is the size of the array a                                         */&lt;br /&gt;/* !!!!!!! This data structure is NOT documented, do not use it !!!!!!!!!! */&lt;br /&gt;&lt;br /&gt;#define SGLIB_QUEUE_INIT(type, a, i, j) { i = j = 0; }&lt;br /&gt;#define SGLIB_QUEUE_IS_EMPTY(type, a, i, j) ((i)==(j))&lt;br /&gt;#define SGLIB_QUEUE_IS_FULL(type, a, i, j, dim) ((i)==((j)+1)%(dim))&lt;br /&gt;#define SGLIB_QUEUE_FIRST_ELEMENT(type, a, i, j) (a[i])&lt;br /&gt;#define SGLIB_QUEUE_ADD_NEXT(type, a, i, j, dim) {\&lt;br /&gt;  if (SGLIB_QUEUE_IS_FULL(type, a, i, j, dim)) assert(0 &amp;&amp; "the queue is full");\&lt;br /&gt;  (j) = ((j)+1) % (dim);\&lt;br /&gt;}&lt;br /&gt;#define SGLIB_QUEUE_ADD(type, a, elem, i, j, dim) {\&lt;br /&gt;  a[j] = (elem);\&lt;br /&gt;  SGLIB_QUEUE_ADD_NEXT(type, a, i, j, dim);\&lt;br /&gt;}&lt;br /&gt;#define SGLIB_QUEUE_DELETE_FIRST(type, a, i, j, dim) {\&lt;br /&gt;  if (SGLIB_QUEUE_IS_EMPTY(type, a, i, j)) assert(0 &amp;&amp; "the queue is empty");\&lt;br /&gt;  (i) = ((i)+1) % (dim);\&lt;br /&gt;}&lt;br /&gt;#define SGLIB_QUEUE_DELETE(type, a, i, j, dim) {\&lt;br /&gt;  SGLIB_QUEUE_DELETE_FIRST(type, a, i, j, dim);\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* ----------------- priority queue (heap) (in an array) -------------------- */&lt;br /&gt;/* heap is a triple (a,i,dim) such that:                                      */&lt;br /&gt;/*  a is the array storing values                                             */&lt;br /&gt;/*  i is the index of the first free element in the array                     */&lt;br /&gt;/*  dim is the size of the array a                                            */&lt;br /&gt;/* !!!!!!! This data structure is NOT documented, do not use it !!!!!!!!!!    */&lt;br /&gt;&lt;br /&gt;#define SGLIB_HEAP_INIT(type, a, i) { i = 0; }&lt;br /&gt;#define SGLIB_HEAP_IS_EMPTY(type, a, i) ((i)==0)&lt;br /&gt;#define SGLIB_HEAP_IS_FULL(type, a, i, dim) ((i)==(dim))&lt;br /&gt;#define SGLIB_HEAP_FIRST_ELEMENT(type, a, i) (a[0])&lt;br /&gt;#define SGLIB_HEAP_ADD_NEXT(type, a, i, dim, comparator, elem_exchanger) {\&lt;br /&gt;  int _i_;\&lt;br /&gt;  if (SGLIB_HEAP_IS_FULL(type, a, i, dim)) assert(0 &amp;&amp; "the heap is full");\&lt;br /&gt;  _i_ = (i)++;\&lt;br /&gt;  while (_i_ &gt; 0 &amp;&amp; comparator(a[_i_/2], a[_i_]) &lt; 0) {\&lt;br /&gt;    elem_exchanger(type, a, (_i_/2), _i_);\&lt;br /&gt;    _i_ = _i_/2;\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;#define SGLIB_HEAP_ADD(type, a, elem, i, dim, comparator) {\&lt;br /&gt;  if (SGLIB_HEAP_IS_FULL(type, a, i, dim)) assert(0 &amp;&amp; "the heap is full");\&lt;br /&gt;  a[i] = (elem);\&lt;br /&gt;  SGLIB_HEAP_ADD_NEXT(type, a, i, dim, comparator, SGLIB_ARRAY_ELEMENTS_EXCHANGER);\&lt;br /&gt;}&lt;br /&gt;#define SGLIB_HEAP_DELETE_FIRST(type, a, i, dim, comparator, elem_exchanger) {\&lt;br /&gt;  if (SGLIB_HEAP_IS_EMPTY(type, a, i)) assert(0 &amp;&amp; "the heap is empty");\&lt;br /&gt;  (i)--;\&lt;br /&gt;  a[0] = a[i];\&lt;br /&gt;  SGLIB___ARRAY_HEAP_DOWN(type, a, 0, i, comparator, elem_exchanger);\&lt;br /&gt;}&lt;br /&gt;#define SGLIB_HEAP_DELETE(type, a, i, dim, comparator) {\&lt;br /&gt;  SGLIB_HEAP_DELETE_FIRST(type, a, i, dim, comparator, SGLIB_ARRAY_ELEMENTS_EXCHANGER);\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* ----------------- hashed table of pointers (in an array) -------------------- */&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;&lt;br /&gt;  This hashed table is storing pointers to objects (not containers).&lt;br /&gt;  In this table there is a one-to-one mapping between 'objects' stored&lt;br /&gt;  in the table and indexes where they are placed. Each index is&lt;br /&gt;  pointing to exactly one 'object' and each 'object' stored in the&lt;br /&gt;  table occurs on exactly one index.  Once an object is stored in the&lt;br /&gt;  table, it can be represented via its index.&lt;br /&gt;&lt;br /&gt;  In case of collision while adding an object the index shifted &lt;br /&gt;  by SGLIB_HASH_TAB_SHIFT_CONSTANT (constant can be redefined)&lt;br /&gt;&lt;br /&gt;  You can NOT delete an element from such hash table. The only&lt;br /&gt;  justification (I can see) for this data structure is an exchange&lt;br /&gt;  file format, having an index table at the beginning and then&lt;br /&gt;  refering objects via indexes.&lt;br /&gt;&lt;br /&gt;  !!!!!!! This data structure is NOT documented, do not use it !!!!!!!!!! &lt;br /&gt;&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;#define SGLIB_HASH_TAB_INIT(type, table, dim) {\&lt;br /&gt;  int _i_;\&lt;br /&gt;  for(_i_ = 0; _i_ &lt; (dim); _i_++) (table)[_i_] = NULL;\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_HASH_TAB_ADD_IF_NOT_MEMBER(type, table, dim, elem, hash_function, comparator, member){\&lt;br /&gt;  unsigned _pos_;\&lt;br /&gt;  type     *_elem_;\&lt;br /&gt;  SGLIB_HASH_TAB_FIND_MEMBER(type, table, dim, elem, _pos_, _elem_);\&lt;br /&gt;  (member) = (table)[_pos_];\&lt;br /&gt;  if (_elem_ == NULL) {\&lt;br /&gt;    if ((table)[_pos_] != NULL) assert(0 &amp;&amp; "the hash table is full");\&lt;br /&gt;    (table)[_pos_] = (elem);\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_HASH_TAB_FIND_MEMBER(type, table, dim, elem, hash_function, comparator, resultIndex, resultMember) {\&lt;br /&gt;  unsigned _i_;\&lt;br /&gt;  int      _count_;\&lt;br /&gt;  type     *_e_;\&lt;br /&gt;  _count = 0;\&lt;br /&gt;  _i_ = hash_function(elem);\&lt;br /&gt;  _i_ %= (dim);\&lt;br /&gt;  while ((_e_=(table)[_i_])!=NULL &amp;&amp; comparator(_e_, (elem))!=0 &amp;&amp; _count_&lt;(dim)) {\&lt;br /&gt;    _count_ ++;\&lt;br /&gt;    _i_ = (_i_ + SGLIB_HASH_TAB_SHIFT_CONSTANT) % (dim);\&lt;br /&gt;  }\&lt;br /&gt;  (resultIndex) = _i_;\&lt;br /&gt;  if (_count_ &lt; (dim)) (resultMember) = _e_;\&lt;br /&gt;  else (resultMember) = NULL;\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_HASH_TAB_IS_MEMBER(type, table, dim, elem, hash_function, resultIndex) {\&lt;br /&gt;  unsigned _i_;\&lt;br /&gt;  int      _c_;\&lt;br /&gt;  type     *_e_;\&lt;br /&gt;  _count = 0;\&lt;br /&gt;  _i_ = hash_function(elem);\&lt;br /&gt;  _i_ %= (dim);\&lt;br /&gt;  while ((_e_=(table)[_i_])!=NULL &amp;&amp; _e_!=(elem) &amp;&amp; _c_&lt;(dim)) {\&lt;br /&gt;    _c_ ++;\&lt;br /&gt;    _i_ = (_i_ + SGLIB_HASH_TAB_SHIFT_CONSTANT) % (dim);\&lt;br /&gt;  }\&lt;br /&gt;  if (_e_==(elem)) (resultIndex) = _i_;\&lt;br /&gt;  else (resultIndex) = -1;\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_HASH_TAB_MAP_ON_ELEMENTS(type, table, dim, iteratedIndex, iteratedVariable, command) {\&lt;br /&gt;  unsigned  iteratedIndex;\&lt;br /&gt;  type      *iteratedVariable;\&lt;br /&gt;  for(iteratedIndex=0; iteratedIndex &lt; (dim); iteratedIndex++) {\&lt;br /&gt;    iteratedVariable = (table)[iteratedIndex];\&lt;br /&gt;    if (iteratedVariable != NULL) {command;}\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* ---------------------------------------------------------------------------- */&lt;br /&gt;/* ------------------------- DYNAMIC DATA STRUCTURES -------------------------- */&lt;br /&gt;/* ---------------------------------------------------------------------------- */&lt;br /&gt;&lt;br /&gt;/* ------------------------------------ lists (level 0) --------------------- */&lt;br /&gt;&lt;br /&gt;#define SGLIB_LIST_ADD(type, list, elem, next) {\&lt;br /&gt;  (elem)-&gt;next = (list);\&lt;br /&gt;  (list) = (elem);\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_LIST_CONCAT(type, first, second, next) {\&lt;br /&gt;  if ((first)==NULL) {\&lt;br /&gt;    (first) = (second);\&lt;br /&gt;  } else {\&lt;br /&gt;    type *_p_;\&lt;br /&gt;    for(_p_ = (first); _p_-&gt;next!=NULL; _p_=_p_-&gt;next) ;\&lt;br /&gt;    _p_-&gt;next = (second);\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_LIST_DELETE(type, list, elem, next) {\&lt;br /&gt;  type **_p_;\&lt;br /&gt;  for(_p_ = &amp;(list); *_p_!=NULL &amp;&amp; *_p_!=(elem); _p_= &amp;(*_p_)-&gt;next) ;\&lt;br /&gt;  assert(*_p_!=NULL &amp;&amp; "element is not member of the container, use DELETE_IF_MEMBER instead"!=NULL);\&lt;br /&gt;  *_p_ = (*_p_)-&gt;next;\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_LIST_ADD_IF_NOT_MEMBER(type, list, elem, comparator, next, member) {\&lt;br /&gt;  type *_p_;\&lt;br /&gt;  for(_p_ = (list); _p_!=NULL &amp;&amp; comparator(_p_, (elem)) != 0; _p_= _p_-&gt;next) ;\&lt;br /&gt;  (member) = _p_;\&lt;br /&gt;  if (_p_ == NULL) {\&lt;br /&gt;    SGLIB_LIST_ADD(type, list, elem, next);\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_LIST_DELETE_IF_MEMBER(type, list, elem, comparator, next, member) {\&lt;br /&gt;  type **_p_;\&lt;br /&gt;  for(_p_ = &amp;(list); *_p_!=NULL &amp;&amp; comparator((*_p_), (elem)) != 0; _p_= &amp;(*_p_)-&gt;next) ;\&lt;br /&gt;  (member) = *_p_;\&lt;br /&gt;  if (*_p_ != NULL) {\&lt;br /&gt;    *_p_ = (*_p_)-&gt;next;\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_LIST_IS_MEMBER(type, list, elem, next, result) {\&lt;br /&gt;  type *_p_;\&lt;br /&gt;  for(_p_ = (list); _p_!=NULL &amp;&amp; _p_ != (elem); _p_= _p_-&gt;next) ;\&lt;br /&gt;  (result) = (_p_!=NULL);\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_LIST_FIND_MEMBER(type, list, elem, comparator, next, member) {\&lt;br /&gt;  type *_p_;\&lt;br /&gt;  for(_p_ = (list); _p_!=NULL &amp;&amp; comparator(_p_, (elem)) != 0; _p_= _p_-&gt;next) ;\&lt;br /&gt;  (member) = _p_;\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_LIST_MAP_ON_ELEMENTS(type, list, iteratedVariable, next, command) {\&lt;br /&gt;  type *_ne_;\&lt;br /&gt;  type *iteratedVariable;\&lt;br /&gt;  (iteratedVariable) = (list); \&lt;br /&gt;  while ((iteratedVariable)!=NULL) {\&lt;br /&gt;    _ne_ = (iteratedVariable)-&gt;next;\&lt;br /&gt;    {command;};\&lt;br /&gt;    (iteratedVariable) = _ne_;\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_LIST_LEN(type, list, next, result) {\&lt;br /&gt;  type *_ce_;\&lt;br /&gt;  (result) = 0;\&lt;br /&gt;  SGLIB_LIST_MAP_ON_ELEMENTS(type, list, _ce_, next, (result)++);\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_LIST_REVERSE(type, list, next) {\&lt;br /&gt;  type *_list_,*_tmp_,*_res_;\&lt;br /&gt;  _list_ = (list);\&lt;br /&gt;  _res_ = NULL;\&lt;br /&gt;  while (_list_!=NULL) {\&lt;br /&gt;    _tmp_ = _list_-&gt;next; _list_-&gt;next = _res_;\&lt;br /&gt;    _res_ = _list_;   _list_ = _tmp_;\&lt;br /&gt;  }\&lt;br /&gt;  (list) = _res_;\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_LIST_SORT(type, list, comparator, next) {\&lt;br /&gt;  /* a non-recursive merge sort on lists */\&lt;br /&gt;  type *_r_;\&lt;br /&gt;  type *_a_, *_b_, *_todo_, *_t_, **_restail_;\&lt;br /&gt;  int _i_, _n_, _contFlag_;\&lt;br /&gt;  _r_ = (list);\&lt;br /&gt;  _contFlag_ = 1;\&lt;br /&gt;  for(_n_ = 1; _contFlag_; _n_ = _n_+_n_) {\&lt;br /&gt;    _todo_ = _r_; _r_ = NULL; _restail_ = &amp;_r_; _contFlag_ =0;\&lt;br /&gt;    while (_todo_!=NULL) {\&lt;br /&gt;      _a_ = _todo_;\&lt;br /&gt;      for(_i_ = 1, _t_ = _a_;  _i_ &lt; _n_ &amp;&amp; _t_!=NULL;  _i_++, _t_ = _t_-&gt;next) ;\&lt;br /&gt;      if (_t_ ==NULL) {\&lt;br /&gt;        *_restail_ = _a_;\&lt;br /&gt;        break;\&lt;br /&gt;      }\&lt;br /&gt;      _b_ = _t_-&gt;next; _t_-&gt;next=NULL;\&lt;br /&gt;      for(_i_ =1, _t_ = _b_;  _i_&lt;_n_ &amp;&amp; _t_!=NULL;  _i_++, _t_ = _t_-&gt;next) ;\&lt;br /&gt;      if (_t_ ==NULL) {\&lt;br /&gt;        _todo_ =NULL;\&lt;br /&gt;      } else {\&lt;br /&gt;        _todo_ = _t_-&gt;next; _t_-&gt;next=NULL;\&lt;br /&gt;      }\&lt;br /&gt;      /* merge */\&lt;br /&gt;      while (_a_!=NULL &amp;&amp; _b_!=NULL) {\&lt;br /&gt;        if (comparator(_a_, _b_) &lt; 0) {\&lt;br /&gt;          *_restail_ = _a_;  _restail_ = &amp;(_a_-&gt;next); _a_ = _a_-&gt;next;\&lt;br /&gt;        } else {\&lt;br /&gt;          *_restail_ = _b_;  _restail_ = &amp;(_b_-&gt;next); _b_ = _b_-&gt;next;\&lt;br /&gt;        }\&lt;br /&gt;      }\&lt;br /&gt;      if (_a_!=NULL) *_restail_ = _a_;\&lt;br /&gt;      else *_restail_ = _b_;\&lt;br /&gt;      while (*_restail_!=NULL) _restail_ = &amp;((*_restail_)-&gt;next);\&lt;br /&gt;      _contFlag_ =1;\&lt;br /&gt;    }\&lt;br /&gt;  }\&lt;br /&gt;  (list) = _r_;\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* --------------------------------- sorted list (level 0) --------------------- */&lt;br /&gt;/*&lt;br /&gt;  All operations suppose that the list is sorted and they preserve&lt;br /&gt;  this property.&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define SGLIB_SORTED_LIST_ADD(type, list, elem, comparator, next) {\&lt;br /&gt;  type **_e_;\&lt;br /&gt;  int  _cmpres_;\&lt;br /&gt;  SGLIB_SORTED_LIST_FIND_MEMBER_OR_PLACE(type, list, elem, comparator, next, _cmpres_, _e_);\&lt;br /&gt;  (elem)-&gt;next = *_e_;\&lt;br /&gt;  *_e_ = (elem);\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_SORTED_LIST_ADD_IF_NOT_MEMBER(type, list, elem, comparator, next, member) {\&lt;br /&gt;  type **_e_;\&lt;br /&gt;  int _cmp_res_;\&lt;br /&gt;  SGLIB_SORTED_LIST_FIND_MEMBER_OR_PLACE(type, list, elem, comparator, next, _cmp_res_, _e_);\&lt;br /&gt;  if (_cmp_res_ != 0) {\&lt;br /&gt;    (elem)-&gt;next = *_e_;\&lt;br /&gt;    *_e_ = (elem);\&lt;br /&gt;    (member) = NULL;\&lt;br /&gt;  } else {\&lt;br /&gt;    (member) = *_e_;\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_SORTED_LIST_DELETE(type, list, elem, next) {\&lt;br /&gt;  SGLIB_LIST_DELETE(type, list, elem, next);\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_SORTED_LIST_DELETE_IF_MEMBER(type, list, elem, comparator, next, member) {\&lt;br /&gt;  type **_e_;\&lt;br /&gt;  int _cmp_res_;\&lt;br /&gt;  SGLIB_SORTED_LIST_FIND_MEMBER_OR_PLACE(type, list, elem, comparator, next, _cmp_res_, _e_);\&lt;br /&gt;  if (_cmp_res_ == 0) {\&lt;br /&gt;    (member) = *_e_;\&lt;br /&gt;    *_e_ = (*_e_)-&gt;next;\&lt;br /&gt;  } else {\&lt;br /&gt;    (member) = NULL;\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_SORTED_LIST_FIND_MEMBER(type, list, elem, comparator, next, member) {\&lt;br /&gt;  type *_p_;\&lt;br /&gt;  int _cmpres_ = 1;\&lt;br /&gt;  for(_p_ = (list); _p_!=NULL &amp;&amp; (_cmpres_=comparator(_p_, (elem))) &lt; 0; _p_=_p_-&gt;next) ;\&lt;br /&gt;  if (_cmpres_ != 0) (member) = NULL;\&lt;br /&gt;  else (member) = _p_;\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_SORTED_LIST_IS_MEMBER(type, list, elem, comparator, next, result) {\&lt;br /&gt;  type *_p_;\&lt;br /&gt;  for(_p_ = (list); _p_!=NULL &amp;&amp; comparator(_p_, (elem)) &lt; 0; _p_=_p_-&gt;next) ;\&lt;br /&gt;  while (_p_ != NULL &amp;&amp; _p_ != (elem) &amp;&amp; comparator(_p_, (elem)) == 0) _p_=_p_-&gt;next;\&lt;br /&gt;  (result) = (_p_ == (elem));\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_SORTED_LIST_FIND_MEMBER_OR_PLACE(type, list, elem, comparator, next, comparator_result, member_ptr) {\&lt;br /&gt;  (comparator_result) = -1;\&lt;br /&gt;  for((member_ptr) = &amp;(list); \&lt;br /&gt;      *(member_ptr)!=NULL &amp;&amp; ((comparator_result)=comparator((*member_ptr), (elem))) &lt; 0; \&lt;br /&gt;      (member_ptr) = &amp;(*(member_ptr))-&gt;next) ;\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_SORTED_LIST_LEN(type, list, next, result) {\&lt;br /&gt;  SGLIB_LIST_LEN(type, list, next, result);\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_SORTED_LIST_MAP_ON_ELEMENTS(type, list, iteratedVariable, next, command) {\&lt;br /&gt;  SGLIB_LIST_MAP_ON_ELEMENTS(type, list, iteratedVariable, next, command);\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* ------------------------------- double linked list (level 0) ------------------------- */&lt;br /&gt;/*&lt;br /&gt;  Lists with back pointer to previous element. Those lists implements deletion&lt;br /&gt;  of an element in a constant time.&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;#define SGLIB___DL_LIST_CREATE_SINGLETON(type, list, elem, previous, next) {\&lt;br /&gt;  (list) = (elem);\&lt;br /&gt;  (list)-&gt;next = (list)-&gt;previous = NULL;\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_DL_LIST_ADD_AFTER(type, place, elem, previous, next) {\&lt;br /&gt;  if ((place) == NULL) {\&lt;br /&gt;    SGLIB___DL_LIST_CREATE_SINGLETON(type, place, elem, previous, next);\&lt;br /&gt;  } else {\&lt;br /&gt;    (elem)-&gt;next = (place)-&gt;next;\&lt;br /&gt;    (elem)-&gt;previous = (place);\&lt;br /&gt;    (place)-&gt;next = (elem);\&lt;br /&gt;    if ((elem)-&gt;next != NULL) (elem)-&gt;next-&gt;previous = (elem);\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_DL_LIST_ADD_BEFORE(type, place, elem, previous, next) {\&lt;br /&gt;  if ((place) == NULL) {\&lt;br /&gt;    SGLIB___DL_LIST_CREATE_SINGLETON(type, place, elem, previous, next);\&lt;br /&gt;  } else {\&lt;br /&gt;    (elem)-&gt;next = (place);\&lt;br /&gt;    (elem)-&gt;previous = (place)-&gt;previous;\&lt;br /&gt;    (place)-&gt;previous = (elem);\&lt;br /&gt;    if ((elem)-&gt;previous != NULL) (elem)-&gt;previous-&gt;next = (elem);\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_DL_LIST_ADD(type, list, elem, previous, next) {\&lt;br /&gt;  SGLIB_DL_LIST_ADD_BEFORE(type, list, elem, previous, next)\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB___DL_LIST_GENERIC_ADD_IF_NOT_MEMBER(type, list, elem, comparator, previous, next, member, the_add_operation) {\&lt;br /&gt;  type *_dlp_;\&lt;br /&gt;  for(_dlp_ = (list); _dlp_!=NULL &amp;&amp; comparator(_dlp_, (elem)) != 0; _dlp_= _dlp_-&gt;previous) ;\&lt;br /&gt;  if (_dlp_ == NULL &amp;&amp; (list) != NULL) {\&lt;br /&gt;    for(_dlp_ = (list)-&gt;next; _dlp_!=NULL &amp;&amp; comparator(_dlp_, (elem)) != 0; _dlp_= _dlp_-&gt;next) ;\&lt;br /&gt;  }\&lt;br /&gt;  (member) = _dlp_;\&lt;br /&gt;  if (_dlp_ == NULL) {\&lt;br /&gt;    the_add_operation(type, list, elem, previous, next);\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_DL_LIST_ADD_BEFORE_IF_NOT_MEMBER(type, list, elem, comparator, previous, next, member) {\&lt;br /&gt;  SGLIB___DL_LIST_GENERIC_ADD_IF_NOT_MEMBER(type, list, elem, comparator, previous, next, member, SGLIB_DL_LIST_ADD_BEFORE);\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_DL_LIST_ADD_AFTER_IF_NOT_MEMBER(type, list, elem, comparator, previous, next, member) {\&lt;br /&gt;  SGLIB___DL_LIST_GENERIC_ADD_IF_NOT_MEMBER(type, list, elem, comparator, previous, next, member, SGLIB_DL_LIST_ADD_AFTER);\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_DL_LIST_ADD_IF_NOT_MEMBER(type, list, elem, comparator, previous, next, member) {\&lt;br /&gt;  SGLIB___DL_LIST_GENERIC_ADD_IF_NOT_MEMBER(type, list, elem, comparator, previous, next, member, SGLIB_DL_LIST_ADD);\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_DL_LIST_CONCAT(type, first, second, previous, next) {\&lt;br /&gt;  if ((first)==NULL) {\&lt;br /&gt;    (first) = (second);\&lt;br /&gt;  } else if ((second)!=NULL) {\&lt;br /&gt;    type *_dlp_;\&lt;br /&gt;    for(_dlp_ = (first); _dlp_-&gt;next!=NULL; _dlp_=_dlp_-&gt;next) ;\&lt;br /&gt;    SGLIB_DL_LIST_ADD_AFTER(type, _dlp_, second, previous, next);\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_DL_LIST_DELETE(type, list, elem, previous, next) {\&lt;br /&gt;  type *_l_;\&lt;br /&gt;  _l_ = (list);\&lt;br /&gt;  if (_l_ == (elem)) {\&lt;br /&gt;    if ((elem)-&gt;previous != NULL) _l_ = (elem)-&gt;previous;\&lt;br /&gt;    else _l_ = (elem)-&gt;next;\&lt;br /&gt;  }\&lt;br /&gt;  if ((elem)-&gt;next != NULL) (elem)-&gt;next-&gt;previous = (elem)-&gt;previous;\&lt;br /&gt;  if ((elem)-&gt;previous != NULL) (elem)-&gt;previous-&gt;next = (elem)-&gt;next;\&lt;br /&gt;  (list) = _l_;\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_DL_LIST_DELETE_IF_MEMBER(type, list, elem, comparator, previous, next, member) {\&lt;br /&gt;  type *_dlp_;\&lt;br /&gt;  for(_dlp_ = (list); _dlp_!=NULL &amp;&amp; comparator(_dlp_, (elem)) != 0; _dlp_= _dlp_-&gt;previous) ;\&lt;br /&gt;  if (_dlp_ == NULL &amp;&amp; (list) != NULL) {\&lt;br /&gt;    for(_dlp_ = (list)-&gt;next; _dlp_!=NULL &amp;&amp; comparator(_dlp_, (elem)) != 0; _dlp_= _dlp_-&gt;next) ;\&lt;br /&gt;  }\&lt;br /&gt;  (member) = _dlp_;\&lt;br /&gt;  if (_dlp_ != NULL) {\&lt;br /&gt;    SGLIB_DL_LIST_DELETE(type, list, _dlp_, previous, next);\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_DL_LIST_IS_MEMBER(type, list, elem, previous, next, result) {\&lt;br /&gt;  type *_dlp_;\&lt;br /&gt;  SGLIB_LIST_IS_MEMBER(type, list, elem, previous, result);\&lt;br /&gt;  if (result == 0 &amp;&amp; (list) != NULL) {\&lt;br /&gt;    _dlp_ = (list)-&gt;next;\&lt;br /&gt;    SGLIB_LIST_IS_MEMBER(type, _dlp_, elem, next, result);\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_DL_LIST_FIND_MEMBER(type, list, elem, comparator, previous, next, member) {\&lt;br /&gt;  type *_dlp_;\&lt;br /&gt;  SGLIB_LIST_FIND_MEMBER(type, list, elem, comparator, previous, member);\&lt;br /&gt;  if ((member) == NULL &amp;&amp; (list) != NULL) {\&lt;br /&gt;    _dlp_ = (list)-&gt;next;\&lt;br /&gt;    SGLIB_LIST_FIND_MEMBER(type, _dlp_, elem, comparator, next, member);\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_DL_LIST_MAP_ON_ELEMENTS(type, list, iteratedVariable, previous, next, command) {\&lt;br /&gt;  type *_dl_;\&lt;br /&gt;  type *iteratedVariable;\&lt;br /&gt;  if ((list)!=NULL) {\&lt;br /&gt;    _dl_ = (list)-&gt;next;\&lt;br /&gt;    SGLIB_LIST_MAP_ON_ELEMENTS(type, list, iteratedVariable, previous, command);\&lt;br /&gt;    SGLIB_LIST_MAP_ON_ELEMENTS(type, _dl_, iteratedVariable, next, command);\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_DL_LIST_SORT(type, list, comparator, previous, next) {\&lt;br /&gt;  type *_dll_, *_dlp_, *_dlt_;\&lt;br /&gt;  _dll_ = (list);\&lt;br /&gt;  if (_dll_ != NULL) {\&lt;br /&gt;    for(; _dll_-&gt;previous!=NULL; _dll_=_dll_-&gt;previous) ;\&lt;br /&gt;    SGLIB_LIST_SORT(type, _dll_, comparator, next);\&lt;br /&gt;    SGLIB___DL_LIST_CREATE_FROM_LIST(type, _dll_, previous, next);\&lt;br /&gt;    (list) = _dll_;\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_DL_LIST_GET_FIRST(type, list, previous, next, result) {\&lt;br /&gt;  type *_dll_;\&lt;br /&gt;  _dll_ = (list);\&lt;br /&gt;  if (_dll_ != NULL) {\&lt;br /&gt;    for(; _dll_-&gt;previous!=NULL; _dll_=_dll_-&gt;previous) ;\&lt;br /&gt;  }\&lt;br /&gt;  (result) = _dll_;\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_DL_LIST_GET_LAST(type, list, previous, next, result) {\&lt;br /&gt;  type *_dll_;\&lt;br /&gt;  _dll_ = (list);\&lt;br /&gt;  if (_dll_ != NULL) {\&lt;br /&gt;    for(; _dll_-&gt;next!=NULL; _dll_=_dll_-&gt;next) ;\&lt;br /&gt;  }\&lt;br /&gt;  (result) = _dll_;\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_DL_LIST_LEN(type, list, previous, next, result) {\&lt;br /&gt;  type *_dl_;\&lt;br /&gt;  int _r1_, _r2_;\&lt;br /&gt;  if ((list)==NULL) {\&lt;br /&gt;    (result) = 0;\&lt;br /&gt;  } else {\&lt;br /&gt;    SGLIB_LIST_LEN(type, list, previous, _r1_);\&lt;br /&gt;    _dl_ = (list)-&gt;next;\&lt;br /&gt;    SGLIB_LIST_LEN(type, _dl_, next, _r2_);\&lt;br /&gt;    (result) = _r1_ + _r2_;\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_DL_LIST_REVERSE(type, list, previous, next) {\&lt;br /&gt;  type *_list_,*_nlist_,*_dlp_,*_dln_;\&lt;br /&gt;  _list_ = (list);\&lt;br /&gt;  if (_list_!=NULL) {\&lt;br /&gt;    _nlist_ = _list_-&gt;next;\&lt;br /&gt;    while (_list_!=NULL) {\&lt;br /&gt;      _dln_ = _list_-&gt;next; \&lt;br /&gt;      _dlp_ = _list_-&gt;previous; \&lt;br /&gt;      _list_-&gt;next = _dlp_;\&lt;br /&gt;      _list_-&gt;previous = _dln_;\&lt;br /&gt;      _list_ = _dlp_;\&lt;br /&gt;    }\&lt;br /&gt;    while (_nlist_!=NULL) {\&lt;br /&gt;      _dln_ = _nlist_-&gt;next; \&lt;br /&gt;      _dlp_ = _nlist_-&gt;previous; \&lt;br /&gt;      _nlist_-&gt;next = _dlp_;\&lt;br /&gt;      _nlist_-&gt;previous = _dln_;\&lt;br /&gt;      _nlist_ = _dln_;\&lt;br /&gt;    }\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB___DL_LIST_CREATE_FROM_LIST(type, list, previous, next) {\&lt;br /&gt;  type *_dlp_, *_dlt_;\&lt;br /&gt;  _dlp_ = NULL;\&lt;br /&gt;  for(_dlt_ = (list); _dlt_!=NULL; _dlt_ = _dlt_-&gt;next) {\&lt;br /&gt;    _dlt_-&gt;previous = _dlp_;\&lt;br /&gt;    _dlp_ = _dlt_;\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* ------------------------------- binary tree traversal (level 0) -------------------- */&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define SGLIB___BIN_TREE_MAP_ON_ELEMENTS(type, tree, iteratedVariable, order, left, right, command) {\&lt;br /&gt;  /* this is non-recursive implementation of tree traversal */\&lt;br /&gt;  /* it maintains the path to the current node in the array '_path_' */\&lt;br /&gt;  /* the _path_[0] contains the root of the tree; */\&lt;br /&gt;  /* the _path_[_pathi_] contains the _current_element_ */\&lt;br /&gt;  /* the macro does not use the _current_element_ after execution of command */\&lt;br /&gt;  /* command can destroy it, it can free the element for example */\&lt;br /&gt;  type *_path_[SGLIB_MAX_TREE_DEEP];\&lt;br /&gt;  type *_right_[SGLIB_MAX_TREE_DEEP];\&lt;br /&gt;  char _pass_[SGLIB_MAX_TREE_DEEP];\&lt;br /&gt;  type *_cn_;\&lt;br /&gt;  int _pathi_;\&lt;br /&gt;  type *iteratedVariable;\&lt;br /&gt;  _cn_ = (tree);\&lt;br /&gt;  _pathi_ = 0;\&lt;br /&gt;  while (_cn_!=NULL) {\&lt;br /&gt;    /* push down to leftmost innermost element */\&lt;br /&gt;    while(_cn_!=NULL) {\&lt;br /&gt;      _path_[_pathi_] = _cn_;\&lt;br /&gt;      _right_[_pathi_] = _cn_-&gt;right;\&lt;br /&gt;      _pass_[_pathi_] = 0;\&lt;br /&gt;      _cn_ = _cn_-&gt;left;\&lt;br /&gt;      if (order == 0) {\&lt;br /&gt;        iteratedVariable = _path_[_pathi_];\&lt;br /&gt;        {command;}\&lt;br /&gt;      }\&lt;br /&gt;      _pathi_ ++;\&lt;br /&gt;      if (_pathi_ &gt;= SGLIB_MAX_TREE_DEEP) assert(0 &amp;&amp; "the binary_tree is too deep");\&lt;br /&gt;    }\&lt;br /&gt;    do {\&lt;br /&gt;      _pathi_ --;\&lt;br /&gt;      if ((order==1 &amp;&amp; _pass_[_pathi_] == 0)\&lt;br /&gt;          || (order == 2 &amp;&amp; (_pass_[_pathi_] == 1 || _right_[_pathi_]==NULL))) {\&lt;br /&gt;        iteratedVariable = _path_[_pathi_];\&lt;br /&gt;        {command;}\&lt;br /&gt;      }\&lt;br /&gt;      _pass_[_pathi_] ++;\&lt;br /&gt;    } while (_pathi_&gt;0 &amp;&amp; _right_[_pathi_]==NULL) ;\&lt;br /&gt;    _cn_ = _right_[_pathi_];\&lt;br /&gt;    _right_[_pathi_] = NULL;\&lt;br /&gt;    _pathi_ ++;\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_BIN_TREE_MAP_ON_ELEMENTS(type, tree, _current_element_, left, right, command) {\&lt;br /&gt;  SGLIB___BIN_TREE_MAP_ON_ELEMENTS(type, tree, _current_element_, 1, left, right, command);\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_BIN_TREE_MAP_ON_ELEMENTS_PREORDER(type, tree, _current_element_, left, right, command) {\&lt;br /&gt;  SGLIB___BIN_TREE_MAP_ON_ELEMENTS(type, tree, _current_element_, 0, left, right, command);\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB_BIN_TREE_MAP_ON_ELEMENTS_POSTORDER(type, tree, _current_element_, left, right, command) {\&lt;br /&gt;  SGLIB___BIN_TREE_MAP_ON_ELEMENTS(type, tree, _current_element_, 2, left, right, command);\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB___BIN_TREE_FIND_MEMBER(type, tree, elem, left, right, comparator, res) {\&lt;br /&gt;  type *_s_;\&lt;br /&gt;  int _c_;\&lt;br /&gt;  _s_ = (tree);\&lt;br /&gt;  while (_s_!=NULL) {\&lt;br /&gt;    _c_ = comparator((elem), _s_);\&lt;br /&gt;    if (_c_ &lt; 0) _s_ = _s_-&gt;left;\&lt;br /&gt;    else if (_c_ &gt; 0) _s_ = _s_-&gt;right;\&lt;br /&gt;    else break;\&lt;br /&gt;  }\&lt;br /&gt;  (res) = _s_;\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* ---------------------------------------------------------------------------- */&lt;br /&gt;/* ---------------------------------------------------------------------------- */&lt;br /&gt;/* -                             LEVEL - 1  INTERFACE                         - */&lt;br /&gt;/* ---------------------------------------------------------------------------- */&lt;br /&gt;/* ---------------------------------------------------------------------------- */&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* ---------------------------------------------------------------------------- */&lt;br /&gt;/* ------------------------------ STATIC ARRAYS ------------------------------- */&lt;br /&gt;/* ---------------------------------------------------------------------------- */&lt;br /&gt;&lt;br /&gt;/* ----------------------------- array sorting (level 1) ---------------------- */&lt;br /&gt;&lt;br /&gt;#define SGLIB_DEFINE_ARRAY_SORTING_PROTOTYPES(type, comparator) \&lt;br /&gt; extern void sglib_##type##_array_quick_sort(type *a, int max);\&lt;br /&gt; extern void sglib_##type##_array_heap_sort(type *a, int max);\&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define SGLIB_DEFINE_ARRAY_SORTING_FUNCTIONS(type, comparator) \&lt;br /&gt; void sglib_##type##_array_quick_sort(type *a, int max) {\&lt;br /&gt;   SGLIB_ARRAY_SINGLE_QUICK_SORT(type, a, max, comparator);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##type##_array_heap_sort(type *a, int max) {\&lt;br /&gt;   SGLIB_ARRAY_SINGLE_HEAP_SORT(type, a, max, comparator);\&lt;br /&gt; }\&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* ----------------------------- array queue (level 1) ------------------- */&lt;br /&gt;/* sglib's queue is stored in a fixed sized array                          */&lt;br /&gt;/* queue_type MUST be a structure containing fields:                       */&lt;br /&gt;/*  afield is the array storing elem_type                                  */&lt;br /&gt;/*  ifield is the index of the first element in the queue                  */&lt;br /&gt;/*  jfield is the index of the first free element after the queue          */&lt;br /&gt;/*  dim is the size of the array afield                                    */&lt;br /&gt;/* !!!!!!! This data structure is NOT documented, do not use it !!!!!!!!!! */&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define SGLIB_DEFINE_QUEUE_PROTOTYPES(queue_type, elem_type, afield, ifield, jfield, dim) \&lt;br /&gt; extern void sglib_##queue_type##_init(queue_type *q); \&lt;br /&gt; extern int sglib_##queue_type##_is_empty(queue_type *q); \&lt;br /&gt; extern int sglib_##queue_type##_is_full(queue_type *q); \&lt;br /&gt; extern elem_type sglib_##queue_type##_first_element(queue_type *q); \&lt;br /&gt; extern elem_type *sglib_##queue_type##_first_element_ptr(queue_type *q); \&lt;br /&gt; extern void sglib_##queue_type##_add_next(queue_type *q); \&lt;br /&gt; extern void sglib_##queue_type##_add(queue_type *q, elem_type elem); \&lt;br /&gt; extern void sglib_##queue_type##_delete_first(queue_type *q); \&lt;br /&gt; extern void sglib_##queue_type##_delete(queue_type *q);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define SGLIB_DEFINE_QUEUE_FUNCTIONS(queue_type, elem_type, afield, ifield, jfield, dim) \&lt;br /&gt; void sglib_##queue_type##_init(queue_type *q) {\&lt;br /&gt;  SGLIB_QUEUE_INIT(elem_type, q-&gt;afield, q-&gt;ifield, q-&gt;jfield);\&lt;br /&gt; }\&lt;br /&gt; int sglib_##queue_type##_is_empty(queue_type *q) {\&lt;br /&gt;  return(SGLIB_QUEUE_IS_EMPTY(elem_type, q-&gt;afield, q-&gt;ifield, q-&gt;jfield));\&lt;br /&gt; }\&lt;br /&gt; int sglib_##queue_type##_is_full(queue_type *q) {\&lt;br /&gt;  return(SGLIB_QUEUE_IS_FULL(elem_type, q-&gt;afield, q-&gt;ifield, q-&gt;jfield));\&lt;br /&gt; }\&lt;br /&gt; elem_type sglib_##queue_type##_first_element(queue_type *q) {\&lt;br /&gt;  return(SGLIB_QUEUE_FIRST_ELEMENT(elem_type, q-&gt;afield, q-&gt;ifield, q-&gt;jfield));\&lt;br /&gt; }\&lt;br /&gt; elem_type *sglib_##queue_type##_first_element_ptr(queue_type *q) {\&lt;br /&gt;  return(&amp; SGLIB_QUEUE_FIRST_ELEMENT(elem_type, q-&gt;afield, q-&gt;ifield, q-&gt;jfield));\&lt;br /&gt; }\&lt;br /&gt; void sglib_##queue_type##_add_next(queue_type *q) {\&lt;br /&gt;  SGLIB_QUEUE_ADD_NEXT(elem_type, q-&gt;afield, q-&gt;ifield, q-&gt;jfield, dim);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##queue_type##_add(queue_type *q, elem_type elem) {\&lt;br /&gt;  SGLIB_QUEUE_ADD(elem_type, q-&gt;afield, elem, q-&gt;ifield, q-&gt;jfield, dim);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##queue_type##_delete_first(queue_type *q) {\&lt;br /&gt;  SGLIB_QUEUE_DELETE_FIRST(elem_type, q-&gt;afield, q-&gt;ifield, q-&gt;jfield, dim);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##queue_type##_delete(queue_type *q) {\&lt;br /&gt;  SGLIB_QUEUE_DELETE_FIRST(elem_type, q-&gt;afield, q-&gt;ifield, q-&gt;jfield, dim);\&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* ------------------------ array heap (level 1) ------------------------- */&lt;br /&gt;/* sglib's heap is a priority queue implemented in a fixed sized array     */&lt;br /&gt;/* heap_type MUST be a structure containing fields:                        */&lt;br /&gt;/*  afield is the array of size dim storing elem_type                      */&lt;br /&gt;/*  ifield is the index of the first free element after the queue          */&lt;br /&gt;/* !!!!!!! This data structure is NOT documented, do not use it !!!!!!!!!! */&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define SGLIB_DEFINE_HEAP_PROTOTYPES(heap_type, elem_type, afield, ifield, dim, comparator, elem_exchanger) \&lt;br /&gt; extern void sglib_##heap_type##_init(heap_type *q); \&lt;br /&gt; extern int sglib_##heap_type##_is_empty(heap_type *q); \&lt;br /&gt; extern int sglib_##heap_type##_is_full(heap_type *q); \&lt;br /&gt; extern elem_type sglib_##heap_type##_first_element(heap_type *q); \&lt;br /&gt; extern elem_type *sglib_##heap_type##_first_element_ptr(heap_type *q); \&lt;br /&gt; extern void sglib_##heap_type##_add_next(heap_type *q); \&lt;br /&gt; extern void sglib_##heap_type##_add(heap_type *q, elem_type elem); \&lt;br /&gt; extern void sglib_##heap_type##_delete_first(heap_type *q); \&lt;br /&gt; extern void sglib_##heap_type##_delete(heap_type *q)&lt;br /&gt;&lt;br /&gt;#define SGLIB_DEFINE_HEAP_FUNCTIONS(heap_type, elem_type, afield, ifield, dim, comparator, elem_exchanger) \&lt;br /&gt; void sglib_##heap_type##_init(heap_type *q) {\&lt;br /&gt;  SGLIB_HEAP_INIT(elem_type, q-&gt;afield, q-&gt;ifield);\&lt;br /&gt; }\&lt;br /&gt; int sglib_##heap_type##_is_empty(heap_type *q) {\&lt;br /&gt;  return(SGLIB_HEAP_IS_EMPTY(elem_type, q-&gt;afield, q-&gt;ifield));\&lt;br /&gt; }\&lt;br /&gt; int sglib_##heap_type##_is_full(heap_type *q) {\&lt;br /&gt;  return(SGLIB_HEAP_IS_FULL(elem_type, q-&gt;afield, q-&gt;ifield));\&lt;br /&gt; }\&lt;br /&gt; elem_type sglib_##heap_type##_first_element(heap_type *q) {\&lt;br /&gt;  return(SGLIB_HEAP_FIRST_ELEMENT(elem_type, q-&gt;afield, q-&gt;ifield));\&lt;br /&gt; }\&lt;br /&gt; elem_type *sglib_##heap_type##_first_element_ptr(heap_type *q) {\&lt;br /&gt;  return(&amp; SGLIB_HEAP_FIRST_ELEMENT(elem_type, q-&gt;afield, q-&gt;ifield));\&lt;br /&gt; }\&lt;br /&gt; void sglib_##heap_type##_add_next(heap_type *q) {\&lt;br /&gt;  SGLIB_HEAP_ADD_NEXT(elem_type, q-&gt;afield, q-&gt;ifield, dim, comparator, elem_exchanger);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##heap_type##_add(heap_type *q, elem_type elem) {\&lt;br /&gt;  SGLIB_HEAP_ADD(elem_type, q-&gt;afield, elem, q-&gt;ifield, dim, comparator, elem_exchanger);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##heap_type##_delete_first(heap_type *q) {\&lt;br /&gt;  SGLIB_HEAP_DELETE_FIRST(elem_type, q-&gt;afield, q-&gt;ifield, dim, comparator, elem_exchanger);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##heap_type##_delete(heap_type *q) {\&lt;br /&gt;  SGLIB_HEAP_DELETE_FIRST(elem_type, q-&gt;afield, q-&gt;ifield, dim, comparator, elem_exchanger);\&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* ------------------------ hashed table  (level 1) ------------------------- */&lt;br /&gt;/*&lt;br /&gt; &lt;br /&gt;  sglib's hash table is an array storing directly pointers to objects (not containers).&lt;br /&gt;  In this table there is a one-to-one mapping between 'objects' stored&lt;br /&gt;  in the table and indexes where they are placed. Each index is&lt;br /&gt;  pointing to exactly one 'object' and each 'object' stored in the&lt;br /&gt;  table occurs on exactly one index.  Once an object is stored in the&lt;br /&gt;  table, it can be represented via its index.&lt;br /&gt;&lt;br /&gt;  type          - is the type of elements&lt;br /&gt;  dim           - is the size of the hash array&lt;br /&gt;  hash_function - is a hashing function mapping type* to unsigned&lt;br /&gt;  comparator    - is a comparator on elements&lt;br /&gt;&lt;br /&gt;  !!!!!!! This data structure is NOT documented, do not use it !!!!!!!!!! &lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;#define SGLIB_DEFINE_HASHED_TABLE_PROTOTYPES(type, dim, hash_function, comparator) \&lt;br /&gt;  struct sglib_hashed_##type##_iterator {\&lt;br /&gt;    int currentIndex;\&lt;br /&gt;    int (*subcomparator)(type *, type *);\&lt;br /&gt;    type *equalto;\&lt;br /&gt;  };\&lt;br /&gt;  extern void sglib_hashed_##type##_init(type *table[dim]);\&lt;br /&gt;  extern int sglib_hashed_##type##_add_if_not_member(type *table[dim], type *elem, type **member);\&lt;br /&gt;  extern int sglib_hashed_##type##_is_member(type *table[dim], type *elem);\&lt;br /&gt;  extern type * sglib_hashed_##type##_find_member(type *table[dim], type *elem);\&lt;br /&gt;  extern type *sglib_hashed_##type##_it_init(struct sglib_hashed_##type##_iterator *it, type *table[dim]); \&lt;br /&gt;  extern type *sglib_hashed_##type##_it_init_on_equal(struct sglib_hashed_##type##_iterator *it, type *table[dim], int (*subcomparator)(type *, type *), type *equalto); \&lt;br /&gt;  extern type *sglib_hashed_##type##_it_current(struct sglib_hashed_##type##_iterator *it); \&lt;br /&gt;  extern type *sglib_hashed_##type##_it_next(struct sglib_hashed_##type##_iterator *it);&lt;br /&gt;&lt;br /&gt;#define SGLIB_DEFINE_HASHED_TABLE_FUNCTIONS(type, dim, hash_function, comparator) \&lt;br /&gt;  struct sglib_hashed_##type##_iterator {\&lt;br /&gt;    int currentIndex;\&lt;br /&gt;    type **table;\&lt;br /&gt;    int (*subcomparator)(type *, type *);\&lt;br /&gt;    type *equalto;\&lt;br /&gt;  };\&lt;br /&gt;  void sglib_hashed_##type##_init(type *table[dim]) {\&lt;br /&gt;    SGLIB_HASH_TAB_INIT(type, table, dim);\&lt;br /&gt;  }\&lt;br /&gt;  int sglib_hashed_##type##_add_if_not_member(type *table[dim], type *elem, type **member) {\&lt;br /&gt;    SGLIB_HASH_TAB_ADD_IF_NOT_MEMBER(type, table, dim, elem, hash_function, comparator, *member);\&lt;br /&gt;  }\&lt;br /&gt;  int sglib_hashed_##type##_is_member(type *table[dim], type *elem) {\&lt;br /&gt;    int ind;\&lt;br /&gt;    SGLIB_HASH_TAB_IS_MEMBER(type, table, dim, elem, hash_function, ind);\&lt;br /&gt;    return(ind != -1);\&lt;br /&gt;  }\&lt;br /&gt;  type * sglib_hashed_##type##_find_member(type *table[dim], type *elem) {\&lt;br /&gt;    type *mmb;\&lt;br /&gt;    int ind;\&lt;br /&gt;    SGLIB_HASH_TAB_FIND_MEMBER(type, table, dim, elem, hash_function, comparator, ind, mmb);\&lt;br /&gt;    return(mmb);\&lt;br /&gt;  }\&lt;br /&gt;  type *sglib_hashed_##type##_it_init_on_equal(struct sglib_hashed_##type##_iterator *it, type *table[dim], int (*subcomparator)(type *, type *), type *equalto) {\&lt;br /&gt;    int i;\&lt;br /&gt;    it-&gt;table = table;\&lt;br /&gt;    it-&gt;subcomparator = subcomparator;\&lt;br /&gt;    it-&gt;equalto = equalto;\&lt;br /&gt;    for(i=0; i&lt;(dim) &amp;&amp; table[i]==NULL; i++) ;\&lt;br /&gt;    it-&gt;currentIndex = i;\&lt;br /&gt;    if (i&lt;(dim)) return(table[i]);\&lt;br /&gt;    return(NULL);\&lt;br /&gt;  }\&lt;br /&gt;  type *sglib_hashed_##type##_it_init(struct sglib_hashed_##type##_iterator *it, type *table[dim]) {\&lt;br /&gt;    sglib_hashed_##type##_it_init_on_equal(it, table, NULL, NULL);\&lt;br /&gt;  }\&lt;br /&gt;  type *sglib_hashed_##type##_it_current(struct sglib_hashed_##type##_iterator *it) {\&lt;br /&gt;    return(table[it-&gt;currentIndex]);\&lt;br /&gt;  }\&lt;br /&gt;  type *sglib_hashed_##type##_it_next(struct sglib_hashed_##type##_iterator *it) {\&lt;br /&gt;    i=it-&gt;currentIndex;\&lt;br /&gt;    if (i&lt;(dim)) {\&lt;br /&gt;      for(i++; i&lt;(dim) &amp;&amp; table[i]==NULL; i++) ;\&lt;br /&gt;    }\&lt;br /&gt;    it-&gt;currentIndex = i;\&lt;br /&gt;    if (i&lt;(dim)) return(table[i]);\&lt;br /&gt;    return(NULL);\&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* ------------------- hashed container (only for level 1)  -------------------- */&lt;br /&gt;/* &lt;br /&gt;  hashed container is a table of given fixed size containing another&lt;br /&gt;  (dynamic) base container in each cell. Once an object should be&lt;br /&gt;  inserted into the hashed container, a hash function is used to&lt;br /&gt;  determine the cell where the object belongs and the object is&lt;br /&gt;  inserted into the base container stored in this cell. Usually the&lt;br /&gt;  base container is simply a list or a sorted list, but it can be a&lt;br /&gt;  red-black tree as well.&lt;br /&gt;&lt;br /&gt;  parameters:&lt;br /&gt;  type - the type of the container stored in each cell.&lt;br /&gt;  dim  - the size of the hashed array&lt;br /&gt;  hash_function - the hashing function hashing 'type *' to unsigned.  &lt;br /&gt;&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;#define SGLIB_DEFINE_HASHED_CONTAINER_PROTOTYPES(type, dim, hash_function) \&lt;br /&gt;  struct sglib_hashed_##type##_iterator {\&lt;br /&gt;    struct sglib_##type##_iterator containerIt;\&lt;br /&gt;    type **table;\&lt;br /&gt;    int currentIndex;\&lt;br /&gt;    int (*subcomparator)(type *, type *);\&lt;br /&gt;    type *equalto;\&lt;br /&gt;  };\&lt;br /&gt;  extern void sglib_hashed_##type##_init(type *table[dim]);\&lt;br /&gt;  extern void sglib_hashed_##type##_add(type *table[dim], type *elem);\&lt;br /&gt;  extern int sglib_hashed_##type##_add_if_not_member(type *table[dim], type *elem, type **member);\&lt;br /&gt;  extern void sglib_hashed_##type##_delete(type *table[dim], type *elem);\&lt;br /&gt;  extern int sglib_hashed_##type##_delete_if_member(type *table[dim], type *elem, type **memb);\&lt;br /&gt;  extern int sglib_hashed_##type##_is_member(type *table[dim], type *elem);\&lt;br /&gt;  extern type * sglib_hashed_##type##_find_member(type *table[dim], type *elem);\&lt;br /&gt;  extern type *sglib_hashed_##type##_it_init(struct sglib_hashed_##type##_iterator *it, type *table[dim]); \&lt;br /&gt;  extern type *sglib_hashed_##type##_it_init_on_equal(struct sglib_hashed_##type##_iterator *it, type *table[dim], int (*subcomparator)(type *, type *), type *equalto); \&lt;br /&gt;  extern type *sglib_hashed_##type##_it_current(struct sglib_hashed_##type##_iterator *it); \&lt;br /&gt;  extern type *sglib_hashed_##type##_it_next(struct sglib_hashed_##type##_iterator *it);&lt;br /&gt;&lt;br /&gt;#define SGLIB_DEFINE_HASHED_CONTAINER_FUNCTIONS(type, dim, hash_function) \&lt;br /&gt;  /*extern unsigned hash_function(type *elem);*/\&lt;br /&gt;  void sglib_hashed_##type##_init(type *table[dim]) {\&lt;br /&gt;    unsigned i;\&lt;br /&gt;    for(i=0; i&lt;(dim); i++) table[i] = NULL;\&lt;br /&gt;  }\&lt;br /&gt;  void sglib_hashed_##type##_add(type *table[dim], type *elem) {\&lt;br /&gt;    unsigned i;\&lt;br /&gt;    i = ((unsigned)hash_function(elem)) % (dim);\&lt;br /&gt;    sglib_##type##_add(&amp;(table)[i], elem);\&lt;br /&gt;  }\&lt;br /&gt;  int sglib_hashed_##type##_add_if_not_member(type *table[dim], type *elem, type **member) {\&lt;br /&gt;    unsigned i;\&lt;br /&gt;    i = ((unsigned)hash_function(elem)) % (dim);\&lt;br /&gt;    return(sglib_##type##_add_if_not_member(&amp;(table)[i], elem, member));\&lt;br /&gt;  }\&lt;br /&gt;  void sglib_hashed_##type##_delete(type *table[dim], type *elem) {\&lt;br /&gt;    unsigned i;\&lt;br /&gt;    i = ((unsigned)hash_function(elem)) % (dim);\&lt;br /&gt;    sglib_##type##_delete(&amp;(table)[i], elem);\&lt;br /&gt;  }\&lt;br /&gt;  int sglib_hashed_##type##_delete_if_member(type *table[dim], type *elem, type **memb) {\&lt;br /&gt;    unsigned i;\&lt;br /&gt;    i = ((unsigned)hash_function(elem)) % (dim);\&lt;br /&gt;    return(sglib_##type##_delete_if_member(&amp;(table)[i], elem, memb));\&lt;br /&gt;  }\&lt;br /&gt;  int sglib_hashed_##type##_is_member(type *table[dim], type *elem) {\&lt;br /&gt;    unsigned i;\&lt;br /&gt;    i = ((unsigned)hash_function(elem)) % (dim);\&lt;br /&gt;    return(sglib_##type##_is_member((table)[i], elem));\&lt;br /&gt;  }\&lt;br /&gt;  type * sglib_hashed_##type##_find_member(type *table[dim], type *elem) {\&lt;br /&gt;    unsigned i;\&lt;br /&gt;    i = ((unsigned)hash_function(elem)) % (dim);\&lt;br /&gt;    return(sglib_##type##_find_member((table)[i], elem));\&lt;br /&gt;  }\&lt;br /&gt;  type *sglib_hashed_##type##_it_init_on_equal(struct sglib_hashed_##type##_iterator *it, type *table[dim], int (*subcomparator)(type *, type *), type *equalto) {\&lt;br /&gt;    type *e;\&lt;br /&gt;    it-&gt;table = table;\&lt;br /&gt;    it-&gt;currentIndex = 0;\&lt;br /&gt;    it-&gt;subcomparator = subcomparator;\&lt;br /&gt;    it-&gt;equalto = equalto;\&lt;br /&gt;    e = sglib_##type##_it_init_on_equal(&amp;it-&gt;containerIt, table[it-&gt;currentIndex], it-&gt;subcomparator, it-&gt;equalto);\&lt;br /&gt;    if (e==NULL) e = sglib_hashed_##type##_it_next(it);\&lt;br /&gt;    return(e);\&lt;br /&gt;  }\&lt;br /&gt;  type *sglib_hashed_##type##_it_init(struct sglib_hashed_##type##_iterator *it, type *table[dim]) {\&lt;br /&gt;	return(sglib_hashed_##type##_it_init_on_equal(it, table, NULL, NULL));\&lt;br /&gt;  }\&lt;br /&gt;  type *sglib_hashed_##type##_it_current(struct sglib_hashed_##type##_iterator *it) {\&lt;br /&gt;    return(sglib_##type##_it_current(&amp;it-&gt;containerIt));\&lt;br /&gt;  }\&lt;br /&gt;  type *sglib_hashed_##type##_it_next(struct sglib_hashed_##type##_iterator *it) {\&lt;br /&gt;    type *e;\&lt;br /&gt;    e = sglib_##type##_it_next(&amp;it-&gt;containerIt);\&lt;br /&gt;    while (e==NULL &amp;&amp; (++(it-&gt;currentIndex))&lt;(dim)) {\&lt;br /&gt;      e = sglib_##type##_it_init_on_equal(&amp;it-&gt;containerIt, it-&gt;table[it-&gt;currentIndex], it-&gt;subcomparator, it-&gt;equalto);\&lt;br /&gt;    }\&lt;br /&gt;    return(e);\&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* ---------------------------------------------------------------------------- */&lt;br /&gt;/* ------------------------- DYNAMIC DATA STRUCTURES -------------------------- */&lt;br /&gt;/* ---------------------------------------------------------------------------- */&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* ------------------------------------ list (level 1) -------------------------------- */&lt;br /&gt;&lt;br /&gt;#define SGLIB_DEFINE_LIST_PROTOTYPES(type, comparator, next) \&lt;br /&gt; struct sglib_##type##_iterator {\&lt;br /&gt;   type *currentelem;\&lt;br /&gt;   type *nextelem;\&lt;br /&gt;   int (*subcomparator)(type *, type *);\&lt;br /&gt;   type *equalto;\&lt;br /&gt; };\&lt;br /&gt; extern void sglib_##type##_add(type **list, type *elem);\&lt;br /&gt; extern int sglib_##type##_add_if_not_member(type **list, type *elem, type **member);\&lt;br /&gt; extern void sglib_##type##_concat(type **first, type *second);\&lt;br /&gt; extern void sglib_##type##_delete(type **list, type *elem);\&lt;br /&gt; extern int sglib_##type##_delete_if_member(type **list, type *elem, type **member);\&lt;br /&gt; extern int sglib_##type##_is_member(type *list, type *elem);\&lt;br /&gt; extern type *sglib_##type##_find_member(type *list, type *elem);\&lt;br /&gt; extern void sglib_##type##_sort(type **list);\&lt;br /&gt; extern int sglib_##type##_len(type *list);\&lt;br /&gt; extern void sglib_##type##_reverse(type **list);\&lt;br /&gt; extern type *sglib_##type##_it_init(struct sglib_##type##_iterator *it, type *list); \&lt;br /&gt; extern type *sglib_##type##_it_init_on_equal(struct sglib_##type##_iterator *it, type *list, int (*subcomparator)(type *, type *), type *equalto); \&lt;br /&gt; extern type *sglib_##type##_it_current(struct sglib_##type##_iterator *it); \&lt;br /&gt; extern type *sglib_##type##_it_next(struct sglib_##type##_iterator *it);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define SGLIB_DEFINE_LIST_FUNCTIONS(type, comparator, next) \&lt;br /&gt; int sglib_##type##_is_member(type *list, type *elem) {\&lt;br /&gt;   int result;\&lt;br /&gt;   SGLIB_LIST_IS_MEMBER(type, list, elem, next, result);\&lt;br /&gt;   return(result);\&lt;br /&gt; }\&lt;br /&gt; type *sglib_##type##_find_member(type *list, type *elem) {\&lt;br /&gt;   type *result;\&lt;br /&gt;   SGLIB_LIST_FIND_MEMBER(type, list, elem, comparator, next, result);\&lt;br /&gt;   return(result);\&lt;br /&gt; }\&lt;br /&gt; int sglib_##type##_add_if_not_member(type **list, type *elem, type **member) {\&lt;br /&gt;   SGLIB_LIST_ADD_IF_NOT_MEMBER(type, *list, elem, comparator, next, *member);\&lt;br /&gt;   return(*member==NULL);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##type##_add(type **list, type *elem) {\&lt;br /&gt;   SGLIB_LIST_ADD(type, *list, elem, next);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##type##_concat(type **first, type *second) {\&lt;br /&gt;   SGLIB_LIST_CONCAT(type, *first, second, next);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##type##_delete(type **list, type *elem) {\&lt;br /&gt;   SGLIB_LIST_DELETE(type, *list, elem, next);\&lt;br /&gt; }\&lt;br /&gt; int sglib_##type##_delete_if_member(type **list, type *elem, type **member) {\&lt;br /&gt;   SGLIB_LIST_DELETE_IF_MEMBER(type, *list, elem, comparator, next, *member);\&lt;br /&gt;   return(*member!=NULL);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##type##_sort(type **list) { \&lt;br /&gt;   SGLIB_LIST_SORT(type, *list, comparator, next);\&lt;br /&gt; }\&lt;br /&gt; int sglib_##type##_len(type *list) {\&lt;br /&gt;   int res;\&lt;br /&gt;   SGLIB_LIST_LEN(type, list, next, res);\&lt;br /&gt;   return(res);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##type##_reverse(type **list) {\&lt;br /&gt;   SGLIB_LIST_REVERSE(type, *list, next);\&lt;br /&gt; }\&lt;br /&gt; \&lt;br /&gt; type *sglib_##type##_it_init_on_equal(struct sglib_##type##_iterator *it, type *list, int (*subcomparator)(type *, type *), type *equalto) {\&lt;br /&gt;   it-&gt;subcomparator = subcomparator;\&lt;br /&gt;   it-&gt;equalto = equalto;\&lt;br /&gt;   it-&gt;nextelem = list;\&lt;br /&gt;   return(sglib_##type##_it_next(it));\&lt;br /&gt; }\&lt;br /&gt; type *sglib_##type##_it_init(struct sglib_##type##_iterator *it, type *list) {\&lt;br /&gt;   return(sglib_##type##_it_init_on_equal(it, list, NULL, NULL));\&lt;br /&gt; }\&lt;br /&gt; type *sglib_##type##_it_current(struct sglib_##type##_iterator *it) {\&lt;br /&gt;   return(it-&gt;currentelem);\&lt;br /&gt; }\&lt;br /&gt; type *sglib_##type##_it_next(struct sglib_##type##_iterator *it) {\&lt;br /&gt;   type *ce, *eq;\&lt;br /&gt;   int  (*scp)(type *, type *);\&lt;br /&gt;   ce = it-&gt;nextelem;\&lt;br /&gt;   it-&gt;nextelem = NULL;\&lt;br /&gt;   if (it-&gt;subcomparator != NULL) {\&lt;br /&gt;	 eq = it-&gt;equalto; \&lt;br /&gt;     scp = it-&gt;subcomparator;\&lt;br /&gt;     while (ce!=NULL &amp;&amp; scp(ce, eq)!=0) ce = ce-&gt;next;\&lt;br /&gt;   }\&lt;br /&gt;   it-&gt;currentelem = ce;\&lt;br /&gt;   if (ce != NULL) it-&gt;nextelem = ce-&gt;next;\&lt;br /&gt;   return(ce);\&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;/* ----------------------------- sorted list (level 1) ----------------------------------- */&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define SGLIB_DEFINE_SORTED_LIST_PROTOTYPES(type, comparator, next) \&lt;br /&gt; struct sglib_##type##_iterator {\&lt;br /&gt;   type *currentelem;\&lt;br /&gt;   type *nextelem;\&lt;br /&gt;   int (*subcomparator)(type *, type *);\&lt;br /&gt;   type *equalto;\&lt;br /&gt; };\&lt;br /&gt; extern void sglib_##type##_add(type **list, type *elem);\&lt;br /&gt; extern int sglib_##type##_add_if_not_member(type **list, type *elem, type **member);\&lt;br /&gt; extern void sglib_##type##_delete(type **list, type *elem);\&lt;br /&gt; extern int sglib_##type##_delete_if_member(type **list, type *elem, type **member);\&lt;br /&gt; extern int sglib_##type##_is_member(type *list, type *elem);\&lt;br /&gt; extern type *sglib_##type##_find_member(type *list, type *elem);\&lt;br /&gt; extern int sglib_##type##_len(type *list);\&lt;br /&gt; extern void sglib_##type##_sort(type **list);\&lt;br /&gt; extern type *sglib_##type##_it_init(struct sglib_##type##_iterator *it, type *list); \&lt;br /&gt; extern type *sglib_##type##_it_init_on_equal(struct sglib_##type##_iterator *it, type *list, int (*subcomparator)(type *, type *), type *equalto); \&lt;br /&gt; extern type *sglib_##type##_it_current(struct sglib_##type##_iterator *it); \&lt;br /&gt; extern type *sglib_##type##_it_next(struct sglib_##type##_iterator *it);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define SGLIB_DEFINE_SORTED_LIST_FUNCTIONS(type, comparator, next) \&lt;br /&gt; int sglib_##type##_is_member(type *list, type *elem) {\&lt;br /&gt;   int result;\&lt;br /&gt;   SGLIB_SORTED_LIST_IS_MEMBER(type, list, elem, comparator, next, result);\&lt;br /&gt;   return(result);\&lt;br /&gt; }\&lt;br /&gt; type *sglib_##type##_find_member(type *list, type *elem) {\&lt;br /&gt;   type *result;\&lt;br /&gt;   SGLIB_SORTED_LIST_FIND_MEMBER(type, list, elem, comparator, next, result);\&lt;br /&gt;   return(result);\&lt;br /&gt; }\&lt;br /&gt; int sglib_##type##_add_if_not_member(type **list, type *elem, type **member) {\&lt;br /&gt;   SGLIB_SORTED_LIST_ADD_IF_NOT_MEMBER(type, *list, elem, comparator, next, *member);\&lt;br /&gt;   return(*member==NULL);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##type##_add(type **list, type *elem) {\&lt;br /&gt;   SGLIB_SORTED_LIST_ADD(type, *list, elem, comparator, next);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##type##_delete(type **list, type *elem) {\&lt;br /&gt;   SGLIB_SORTED_LIST_DELETE(type, *list, elem, next);\&lt;br /&gt; }\&lt;br /&gt; int sglib_##type##_delete_if_member(type **list, type *elem, type **member) {\&lt;br /&gt;   SGLIB_SORTED_LIST_DELETE_IF_MEMBER(type, *list, elem, comparator, next, *member);\&lt;br /&gt;   return(*member!=NULL);\&lt;br /&gt; }\&lt;br /&gt; int sglib_##type##_len(type *list) {\&lt;br /&gt;   int res;\&lt;br /&gt;   SGLIB_SORTED_LIST_LEN(type, list, next, res);\&lt;br /&gt;   return(res);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##type##_sort(type **list) { \&lt;br /&gt;   SGLIB_LIST_SORT(type, *list, comparator, next);\&lt;br /&gt; }\&lt;br /&gt; \&lt;br /&gt; type *sglib_##type##_it_init_on_equal(struct sglib_##type##_iterator *it, type *list, int (*subcomparator)(type *, type *), type *equalto) {\&lt;br /&gt;   it-&gt;subcomparator = subcomparator;\&lt;br /&gt;   it-&gt;equalto = equalto;\&lt;br /&gt;   it-&gt;nextelem = list;\&lt;br /&gt;   return(sglib_##type##_it_next(it));\&lt;br /&gt; }\&lt;br /&gt; type *sglib_##type##_it_init(struct sglib_##type##_iterator *it, type *list) {\&lt;br /&gt;   return(sglib_##type##_it_init_on_equal(it, list, NULL, NULL));\&lt;br /&gt; }\&lt;br /&gt; type *sglib_##type##_it_current(struct sglib_##type##_iterator *it) {\&lt;br /&gt;   return(it-&gt;currentelem);\&lt;br /&gt; }\&lt;br /&gt; type *sglib_##type##_it_next(struct sglib_##type##_iterator *it) {\&lt;br /&gt;   type *ce, *eq;\&lt;br /&gt;   int  (*scp)(type *, type *);\&lt;br /&gt;   int  c;\&lt;br /&gt;   ce = it-&gt;nextelem;\&lt;br /&gt;   it-&gt;nextelem = NULL;\&lt;br /&gt;   if (it-&gt;subcomparator != NULL) {\&lt;br /&gt;	 eq = it-&gt;equalto; \&lt;br /&gt;     scp = it-&gt;subcomparator;\&lt;br /&gt;     while (ce!=NULL &amp;&amp; (c=scp(ce, eq)) &lt; 0) ce = ce-&gt;next;\&lt;br /&gt;     if (ce != NULL &amp;&amp; c &gt; 0) ce = NULL;\&lt;br /&gt;   }\&lt;br /&gt;   it-&gt;currentelem = ce;\&lt;br /&gt;   if (ce != NULL) it-&gt;nextelem = ce-&gt;next;\&lt;br /&gt;   return(ce);\&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* ----------------------------- double linked list (level 1) ------------------------------ */&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define SGLIB_DEFINE_DL_LIST_PROTOTYPES(type, comparator, previous, next) \&lt;br /&gt; struct sglib_##type##_iterator {\&lt;br /&gt;   type *currentelem;\&lt;br /&gt;   type *prevelem;\&lt;br /&gt;   type *nextelem;\&lt;br /&gt;   int (*subcomparator)(type *, type *);\&lt;br /&gt;   type *equalto;\&lt;br /&gt; };\&lt;br /&gt; extern void sglib_##type##_add(type **list, type *elem);\&lt;br /&gt; extern void sglib_##type##_add_before(type **list, type *elem);\&lt;br /&gt; extern void sglib_##type##_add_after(type **list, type *elem);\&lt;br /&gt; extern int sglib_##type##_add_if_not_member(type **list, type *elem, type **member);\&lt;br /&gt; extern int sglib_##type##_add_before_if_not_member(type **list, type *elem, type **member);\&lt;br /&gt; extern int sglib_##type##_add_after_if_not_member(type **list, type *elem, type **member);\&lt;br /&gt; extern void sglib_##type##_concat(type **first, type *second);\&lt;br /&gt; extern void sglib_##type##_delete(type **list, type *elem);\&lt;br /&gt; extern int sglib_##type##_delete_if_member(type **list, type *elem, type **member);\&lt;br /&gt; extern int sglib_##type##_is_member(type *list, type *elem);\&lt;br /&gt; extern type *sglib_##type##_find_member(type *list, type *elem);\&lt;br /&gt; extern type *sglib_##type##_get_first(type *list);\&lt;br /&gt; extern type *sglib_##type##_get_last(type *list);\&lt;br /&gt; extern void sglib_##type##_sort(type **list);\&lt;br /&gt; extern int sglib_##type##_len(type *list);\&lt;br /&gt; extern void sglib_##type##_reverse(type **list);\&lt;br /&gt; extern type *sglib_##type##_it_init(struct sglib_##type##_iterator *it, type *list); \&lt;br /&gt; extern type *sglib_##type##_it_init_on_equal(struct sglib_##type##_iterator *it, type *list, int (*subcomparator)(type *, type *), type *equalto); \&lt;br /&gt; extern type *sglib_##type##_it_current(struct sglib_##type##_iterator *it); \&lt;br /&gt; extern type *sglib_##type##_it_next(struct sglib_##type##_iterator *it);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define SGLIB_DEFINE_DL_LIST_FUNCTIONS(type, comparator, previous, next) \&lt;br /&gt; void sglib_##type##_add(type **list, type *elem) {\&lt;br /&gt;  SGLIB_DL_LIST_ADD(type, *list, elem, previous, next);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##type##_add_after(type **list, type *elem) {\&lt;br /&gt;  SGLIB_DL_LIST_ADD_AFTER(type, *list, elem, previous, next);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##type##_add_before(type **list, type *elem) {\&lt;br /&gt;  SGLIB_DL_LIST_ADD_BEFORE(type, *list, elem, previous, next);\&lt;br /&gt; }\&lt;br /&gt; int sglib_##type##_add_if_not_member(type **list, type *elem, type **member) {\&lt;br /&gt;  SGLIB_DL_LIST_ADD_IF_NOT_MEMBER(type, *list, elem, comparator, previous, next, *member);\&lt;br /&gt;  return(*member==NULL);\&lt;br /&gt; }\&lt;br /&gt; int sglib_##type##_add_after_if_not_member(type **list, type *elem, type **member) {\&lt;br /&gt;  SGLIB_DL_LIST_ADD_AFTER_IF_NOT_MEMBER(type, *list, elem, comparator, previous, next, *member);\&lt;br /&gt;  return(*member==NULL);\&lt;br /&gt; }\&lt;br /&gt; int sglib_##type##_add_before_if_not_member(type **list, type *elem, type **member) {\&lt;br /&gt;  SGLIB_DL_LIST_ADD_BEFORE_IF_NOT_MEMBER(type, *list, elem, comparator, previous, next, *member);\&lt;br /&gt;  return(*member==NULL);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##type##_concat(type **first, type *second) {\&lt;br /&gt;   SGLIB_DL_LIST_CONCAT(type, *first, second, previous, next);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##type##_delete(type **list, type *elem) {\&lt;br /&gt;  SGLIB_DL_LIST_DELETE(type, *list, elem, previous, next);\&lt;br /&gt; }\&lt;br /&gt; int sglib_##type##_delete_if_member(type **list, type *elem, type **member) {\&lt;br /&gt;  SGLIB_DL_LIST_DELETE_IF_MEMBER(type, *list, elem, comparator, previous, next, *member);\&lt;br /&gt;  return(*member!=NULL);\&lt;br /&gt; }\&lt;br /&gt; int sglib_##type##_is_member(type *list, type *elem) {\&lt;br /&gt;   int result;\&lt;br /&gt;   SGLIB_DL_LIST_IS_MEMBER(type, list, elem, previous, next, result);\&lt;br /&gt;   return(result);\&lt;br /&gt; }\&lt;br /&gt; type *sglib_##type##_find_member(type *list, type *elem) {\&lt;br /&gt;   type *result;\&lt;br /&gt;   SGLIB_DL_LIST_FIND_MEMBER(type, list, elem, comparator, previous, next, result);\&lt;br /&gt;   return(result);\&lt;br /&gt; }\&lt;br /&gt; type *sglib_##type##_get_first(type *list) {\&lt;br /&gt;   type *result;\&lt;br /&gt;   SGLIB_DL_LIST_GET_FIRST(type, list, previous, next, result);\&lt;br /&gt;   return(result);\&lt;br /&gt; }\&lt;br /&gt; type *sglib_##type##_get_last(type *list) {\&lt;br /&gt;   type *result;\&lt;br /&gt;   SGLIB_DL_LIST_GET_LAST(type, list, previous, next, result);\&lt;br /&gt;   return(result);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##type##_sort(type **list) {\&lt;br /&gt;   SGLIB_DL_LIST_SORT(type, *list, comparator, previous, next);\&lt;br /&gt; }\&lt;br /&gt; int sglib_##type##_len(type *list) {\&lt;br /&gt;   int res;\&lt;br /&gt;   SGLIB_DL_LIST_LEN(type, list, previous, next, res);\&lt;br /&gt;   return(res);\&lt;br /&gt; }\&lt;br /&gt; void sglib_##type##_reverse(type **list) {\&lt;br /&gt;   SGLIB_DL_LIST_REVERSE(type, *list, previous, next);\&lt;br /&gt; }\&lt;br /&gt; \&lt;br /&gt; type *sglib_##type##_it_init_on_equal(struct sglib_##type##_iterator *it, type *list, int (*subcomparator)(type *, type *), type *equalto) {\&lt;br /&gt;   it-&gt;subcomparator = subcomparator;\&lt;br /&gt;   it-&gt;equalto = equalto;\&lt;br /&gt;   it-&gt;prevelem = list;\&lt;br /&gt;   it-&gt;nextelem = list;\&lt;br /&gt;   if (list != NULL) it-&gt;nextelem = list-&gt;next;\&lt;br /&gt;   return(sglib_##type##_it_next(it));\&lt;br /&gt; }\&lt;br /&gt; type *sglib_##type##_it_init(struct sglib_##type##_iterator *it, type *list) {\&lt;br /&gt;   return(sglib_##type##_it_init_on_equal(it, list, NULL, NULL));\&lt;br /&gt; }\&lt;br /&gt; type *sglib_##type##_it_current(struct sglib_##type##_iterator *it) {\&lt;br /&gt;   return(it-&gt;currentelem);\&lt;br /&gt; }\&lt;br /&gt; type *sglib_##type##_it_next(struct sglib_##type##_iterator *it) {\&lt;br /&gt;   type *ce, *eq;\&lt;br /&gt;   int  (*scp)(type *, type *);\&lt;br /&gt;   ce = it-&gt;prevelem;\&lt;br /&gt;   it-&gt;prevelem = NULL;\&lt;br /&gt;   if (it-&gt;subcomparator != NULL) {\&lt;br /&gt;	 eq = it-&gt;equalto; \&lt;br /&gt;     scp = it-&gt;subcomparator;\&lt;br /&gt;     while (ce!=NULL &amp;&amp; scp(eq, ce)!=0) ce = ce-&gt;previous;\&lt;br /&gt;   }\&lt;br /&gt;   if (ce != NULL) {\&lt;br /&gt;     it-&gt;prevelem = ce-&gt;previous;\&lt;br /&gt;   } else {\&lt;br /&gt;     ce = it-&gt;nextelem;\&lt;br /&gt;     it-&gt;nextelem = NULL;\&lt;br /&gt;     if (it-&gt;subcomparator != NULL) {\&lt;br /&gt;	   eq = it-&gt;equalto; \&lt;br /&gt;       scp = it-&gt;subcomparator;\&lt;br /&gt;       while (ce!=NULL &amp;&amp; scp(ce, eq)!=0) ce = ce-&gt;next;\&lt;br /&gt;     }\&lt;br /&gt;     if (ce != NULL) it-&gt;nextelem = ce-&gt;next;\&lt;br /&gt;   }\&lt;br /&gt;   it-&gt;currentelem = ce;\&lt;br /&gt;   return(ce);\&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* --------------------------------- red-black trees (level 1) -------------------------------- */&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;&lt;br /&gt;This  implementation requires  pointers  to left  and  right sons  (no&lt;br /&gt;parent  pointer  is needed)  and  one  bit  of additional  information&lt;br /&gt;storing the color of  the node. The implementation follows discrepancy&lt;br /&gt;fixing rules from:&lt;br /&gt;http://www.cis.ohio-state.edu/~gurari/course/cis680/cis680Ch11.html&lt;br /&gt;&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;#define SGLIB___RBTREE_FIX_INSERTION_DISCREPANCY(type, tree, leftt, rightt, bits, RED, BLACK) {\&lt;br /&gt;  type *t, *tl, *a, *b, *c, *ar, *bl, *br, *cl, *cr;\&lt;br /&gt;  t = *tree;\&lt;br /&gt;  tl = t-&gt;leftt;\&lt;br /&gt;  if (t-&gt;rightt!=NULL &amp;&amp; SGLIB___GET_VALUE(t-&gt;rightt-&gt;bits)==RED) {\&lt;br /&gt;    if (SGLIB___GET_VALUE(tl-&gt;bits)==RED) {\&lt;br /&gt;      if ((tl-&gt;leftt!=NULL &amp;&amp; SGLIB___GET_VALUE(tl-&gt;leftt-&gt;bits)==RED) \&lt;br /&gt;          || (tl-&gt;rightt!=NULL &amp;&amp; SGLIB___GET_VALUE(tl-&gt;rightt-&gt;bits)==RED)) {\&lt;br /&gt;        SGLIB___SET_VALUE(t-&gt;leftt-&gt;bits,BLACK);\&lt;br /&gt;        SGLIB___SET_VALUE(t-&gt;rightt-&gt;bits,BLACK);\&lt;br /&gt;        SGLIB___SET_VALUE(t-&gt;bits,RED);\&lt;br /&gt;      }\&lt;br /&gt;    }\&lt;br /&gt;  } else {\&lt;br /&gt;    if (SGLIB___GET_VALUE(tl-&gt;bits)==RED) {\&lt;br /&gt;      if (tl-&gt;leftt!=NULL &amp;&amp; SGLIB___GET_VALUE(tl-&gt;leftt-&gt;bits)==RED) {\&lt;br /&gt;        a = t; b = tl; c = tl-&gt;leftt;\&lt;br /&gt;        br = b-&gt;rightt;\&lt;br /&gt;        a-&gt;leftt = br;\&lt;br /&gt;        b-&gt;leftt = c; b-&gt;rightt = a;\&lt;br /&gt;        SGLIB___SET_VALUE(a-&gt;bits,RED);\&lt;br /&gt;        SGLIB___SET_VALUE(b-&gt;bits,BLACK);\&lt;br /&gt;        *tree = b;\&lt;br /&gt;      } else if (tl-&gt;rightt!=NULL &amp;&amp; SGLIB___GET_VALUE(tl-&gt;rightt-&gt;bits)==RED) {\&lt;br /&gt;        a = t; b = tl; ar=a-&gt;rightt;\&lt;br /&gt;        bl=b-&gt;leftt; c=b-&gt;rightt;\&lt;br /&gt;        cl=c-&gt;leftt; cr=c-&gt;rightt;\&lt;br /&gt;        b-&gt;rightt = cl;\&lt;br /&gt;        a-&gt;leftt = cr;\&lt;br /&gt;        c-&gt;leftt = b;\&lt;br /&gt;        c-&gt;rightt = a;\&lt;br /&gt;        SGLIB___SET_VALUE(c-&gt;bits,BLACK);\&lt;br /&gt;        SGLIB___SET_VALUE(a-&gt;bits,RED);\&lt;br /&gt;        *tree = c;\&lt;br /&gt;      }\&lt;br /&gt;    }\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#define SGLIB___RBTREE_FIX_DELETION_DISCREPANCY(type, tree, leftt, rightt, bits, RED, BLACK, res) {\&lt;br /&gt;  type  *t, *a, *b, *c, *d, *ar, *bl, *br, *cl, *cr, *dl, *dr;\&lt;br /&gt;  t = a = *tree;\&lt;br /&gt;  assert(t!=NULL);\&lt;br /&gt;  ar = a-&gt;rightt;\&lt;br /&gt;  b = t-&gt;leftt;\&lt;br /&gt;  if (b==NULL) {\&lt;br /&gt;    assert(SGLIB___GET_VALUE(t-&gt;bits)==RED);\&lt;br /&gt;    SGLIB___SET_VALUE(t-&gt;bits,BLACK);\&lt;br /&gt;    res = 0;\&lt;br /&gt;  } else {\&lt;br /&gt;    bl = b-&gt;leftt;\&lt;br /&gt;    br = b-&gt;rightt;\&lt;br /&gt;    if (SGLIB___GET_VALUE(b-&gt;bits)==RED) {\&lt;br /&gt;      if (br==NULL) {\&lt;br /&gt;        *tree = b;\&lt;br /&gt;        SGLIB___SET_VALUE(b-&gt;bits,BLACK);\&lt;br /&gt;        b-&gt;rightt = a;\&lt;br /&gt;        a-&gt;leftt = br;\&lt;br /&gt;        res = 0;\&lt;br /&gt;      } else {\&lt;br /&gt;        c = br;\&lt;br /&gt;        assert(c!=NULL &amp;&amp; SGLIB___GET_VALUE(c-&gt;bits)==BLACK);\&lt;br /&gt;        cl = c-&gt;leftt;\&lt;br /&gt;        cr = c-&gt;rightt;\&lt;br /&gt;        if ((cl==NULL||SGLIB___GET_VALUE(cl-&gt;bits)==BLACK) &amp;&amp; (cr==NULL||SGLIB___GET_VALUE(cr-&gt;bits)==BLACK)) {\&lt;br /&gt;          *tree = b;\&lt;br /&gt;          b-&gt;rightt = a;\&lt;br /&gt;          SGLIB___SET_VALUE(b-&gt;bits,BLACK);\&lt;br /&gt;          a-&gt;leftt = c;\&lt;br /&gt;          SGLIB___SET_VALUE(c-&gt;bits,RED);\&lt;br /&gt;          res = 0;\&lt;br /&gt;        } else if (cl!=NULL &amp;&amp; SGLIB___GET_VALUE(cl-&gt;bits)==RED) {\&lt;br /&gt;          if (cr!=NULL &amp;&amp; SGLIB___GET_VALUE(cr-&gt;bits)==RED) {\&lt;br /&gt;            d = cr;\&lt;br /&gt;            dl = d-&gt;leftt;\&lt;br /&gt;            dr = d-&gt;rightt;\&lt;br /&gt;            *tree = d;\&lt;br /&gt;            SGLIB___SET_VALUE(d-&gt;bits,BLACK);\&lt;br /&gt;            d-&gt;leftt = b;\&lt;br /&gt;            c-&gt;rightt = dl;\&lt;br /&gt;            d-&gt;rightt = a;\&lt;br /&gt;            a-&gt;leftt = dr;\&lt;br /&gt;            res = 0;\&lt;br /&gt;          } else {\&lt;br /&gt;            *tree = c;\&lt;br /&gt;            c-&gt;leftt = b;\&lt;br /&gt;            c-&gt;rightt = a;\&lt;br /&gt;            b-&gt;leftt = bl;\&lt;br /&gt;            b-&gt;rightt = cl;\&lt;br /&gt;            a-&gt;leftt = cr;\&lt;br /&gt;            SGLIB___SET_VALUE(cl-&gt;bits,BLACK);\&lt;br /&gt;            res = 0;\&lt;br /&gt;          }\&lt;br /&gt;        } else if (cr!=NULL &amp;&amp; SGLIB___GET_VALUE(cr-&gt;bits)==RED) {\&lt;br /&gt;          assert(cl==NULL || SGLIB___GET_VALUE(cl-&gt;bits)==BLACK);\&lt;br /&gt;          d = cr;\&lt;br /&gt;          dl = d-&gt;leftt;\&lt;br /&gt;          dr = d-&gt;rightt;\&lt;br /&gt;          *tree = d;\&lt;br /&gt;          SGLIB___SET_VALUE(d-&gt;bits,BLACK);\&lt;br /&gt;          d-&gt;leftt = b;\&lt;br /&gt;          c-&gt;rightt = dl;\&lt;br /&gt;          d-&gt;rightt = a;\&lt;br /&gt;          a-&gt;leftt = dr;\&lt;br /&gt;          res = 0;\&lt;br /&gt;        } else {\&lt;br /&gt;          assert(0);\&lt;br /&gt;          res = 0;\&lt;br /&gt;        }\&lt;br /&gt;      }\&lt;br /&gt;    } else {\&lt;br /&gt;      if ((bl==NULL || SGLIB___GET_VALUE(bl-&gt;bits)==BLACK) &amp;&amp; (br==NULL || SGLIB___GET_VALUE(br-&gt;bits)==BLACK)) {\&lt;br /&gt;        res = (SGLIB___GET_VALUE(a-&gt;bits)==BLACK);\&lt;br /&gt;        SGLIB___SET_VALUE(a-&gt;bits,BLACK);\&lt;br /&gt;        SGLIB___SET_VALUE(b-&gt;bits,RED);\&lt;br /&gt;      } else if (bl!=NULL &amp;&amp; SGLIB___GET_VALUE(bl-&gt;bits)==RED) {\&lt;br /&gt;        if (br==NULL || SGLIB___GET_VALUE(br-&gt;bits)==BLACK) {\&lt;br /&gt;          *tree = b;\&lt;br /&gt;          SGLIB___SET_VALUE(b-&gt;bits,SGLIB___GET_VALUE(a-&gt;bits));\&lt;br /&gt;          SGLIB___SET_VALUE(a-&gt;bits,BLACK);\&lt;br /&gt;          b-&gt;rightt = a;\&lt;br /&gt;          a-&gt;leftt = br;\&lt;br /&gt;          SGLIB___SET_VALUE(bl-&gt;bits,BLACK);\&lt;br /&gt;          res = 0;\&lt;br /&gt;        } else {\&lt;br /&gt;          assert(bl!=NULL);\&lt;br /&gt;          assert(br!=NULL);\&lt;br /&gt;          assert(SGLIB___GET_VALUE(bl-&gt;bits)==RED);\&lt;br /&gt;          assert(SGLIB___GET_VALUE(br-&gt;bits)==RED);\&lt;br /&gt;          c = br;\&lt;br /&gt;          cl = c-&gt;leftt;\&lt;br /&gt;          cr = c-&gt;rightt;\&lt;br /&gt;          *tree = c;\&lt;br /&gt;          SGLIB___SET_VALUE(c-&gt;bits,SGLIB___GET_VALUE(a-&gt;bits));\&lt;br /&gt;          SGLIB___SET_VALUE(a-&gt;bits,BLACK);\&lt;br /&gt;          c-&gt;leftt = b;\&lt;br /&gt;          c-&gt;rightt = a;\&lt;br /&gt;          b-&gt;rightt = cl;\&lt;br /&gt;          a-&gt;leftt = cr;\&lt;br /&gt;          res = 0;\&lt;br /&gt;        }\&lt;br /&gt;      } else {\&lt;br /&gt;        assert(br!=NULL &amp;&amp; SGLIB___GET_VALUE(br-&gt;bits)==RED);\&lt;br /&gt;        c = br;\&lt;br /&gt;        cl = c-&gt;leftt;\&lt;br /&gt;        cr = c-&gt;rightt;\&lt;br /&gt;        *tree = c;\&lt;br /&gt;        SGLIB___SET_VALUE(c-&gt;bits,SGLIB___GET_VALUE(a-&gt;bits));\&lt;br /&gt;        SGLIB___SET_VALUE(a-&gt;bits,BLACK);\&lt;br /&gt;        c-&gt;leftt = b;\&lt;br /&gt;        c-&gt;rightt = a;\&lt;br /&gt;        b-&gt;rightt = cl;\&lt;br /&gt;        a-&gt;leftt = cr;\&lt;br /&gt;        res = 0;\&lt;br /&gt;      }\&lt;br /&gt;    }\&lt;br /&gt;  }\&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define SGLIB_DEFINE_RBTREE_FUNCTIONS_GENERAL(type, left, right, bits, comparator, RED, BLACK) \&lt;br /&gt;static void sglib___##type##_fix_left_insertion_discrepancy(type **tree) {\&lt;br /&gt;  SGLIB___RBTREE_FIX_INSERTION_DISCREPANCY(type, tree, left, right, bits, RED, BLACK);\&lt;br /&gt;}\&lt;br /&gt;\&lt;br /&gt;static void sglib___##type##_fix_right_insertion_discrepancy(type **tree) {\&lt;br /&gt;  SGLIB___RBTREE_FIX_INSERTION_DISCREPANCY(type, tree, right, left, bits, RED, BLACK);\&lt;br /&gt;}\&lt;br /&gt;\&lt;br /&gt;static int sglib___##type##_fix_left_deletion_discrepancy(type **tree) {\&lt;br /&gt;  int       res;\&lt;br /&gt;  SGLIB___RBTREE_FIX_DELETION_DISCREPANCY(type, tree, right, left, bits, RED, BLACK, res);\&lt;br /&gt;  return(res);\&lt;br /&gt;}\&lt;br /&gt;\&lt;br /&gt;static int sglib___##type##_fix_right_deletion_discrepancy(type **tree) {\&lt;br /&gt;  int       res;\&lt;br /&gt;  SGLIB___RBTREE_FIX_DELETION_DISCREPANCY(type, tree, left, right, bits, RED, BLACK, res);\&lt;br /&gt;  return(res);\&lt;br /&gt;}\&lt;br /&gt;\&lt;br /&gt;static void sglib___##type##_add_recursive(type **tree, type *elem) {\&lt;br /&gt;  int cmp;\&lt;br /&gt;  type *t;\&lt;br /&gt;  t = *tree;\&lt;br /&gt;  if (t == NULL) {\&lt;br /&gt;    SGLIB___SET_VALUE(elem-&gt;bits,RED);\&lt;br /&gt;    *tree =elem;\&lt;br /&gt;  } else {\&lt;br /&gt;    cmp = comparator(elem, t);\&lt;br /&gt;    if (cmp &lt; 0 || (cmp==0 &amp;&amp; elem&lt;t)) {\&lt;br /&gt;      sglib___##type##_add_recursive(&amp;t-&gt;left, elem);\&lt;br /&gt;      if (SGLIB___GET_VALUE(t-&gt;bits)==BLACK) sglib___##type##_fix_left_insertion_discrepancy(tree);\&lt;br /&gt;    } else {\&lt;br /&gt;      sglib___##type##_add_recursive(&amp;t-&gt;right, elem);\&lt;br /&gt;      if (SGLIB___GET_VALUE(t-&gt;bits)==BLACK) sglib___##type##_fix_right_insertion_discrepancy(tree);\&lt;br /&gt;    }\&lt;br /&gt;  }\&lt;br /&gt;}\&lt;br /&gt;\&lt;br /&gt;static int sglib___##type##_delete_rightmost_leaf(type **tree, type **theLeaf) {\&lt;br /&gt;  type  *t;\&lt;br /&gt;  int       res, deepDecreased;\&lt;br /&gt;  t = *tree;\&lt;br /&gt;  res = 0;\&lt;br /&gt;  assert(t!=NULL);\&lt;br /&gt;  if (t-&gt;right == NULL) {\&lt;br /&gt;    *theLeaf = t;\&lt;br /&gt;    if (t-&gt;left!=NULL) {\&lt;br /&gt;      if (SGLIB___GET_VALUE(t-&gt;bits)==BLACK &amp;&amp; SGLIB___GET_VALUE(t-&gt;left-&gt;bits)==BLACK) res = 1;\&lt;br /&gt;      SGLIB___SET_VALUE(t-&gt;left-&gt;bits,BLACK);\&lt;br /&gt;      *tree = t-&gt;left;\&lt;br /&gt;    } else {\&lt;br /&gt;      *tree = NULL;\&lt;br /&gt;      res = (SGLIB___GET_VALUE(t-&gt;bits)==BLACK);\&lt;br /&gt;    }\&lt;br /&gt;  } else {\&lt;br /&gt;    deepDecreased = sglib___##type##_delete_rightmost_leaf(&amp;t-&gt;right, theLeaf);\&lt;br /&gt;    if (deepDecreased) res = sglib___##type##_fix_right_deletion_discrepancy(tree);\&lt;br /&gt;  }\&lt;br /&gt;  return(res);\&lt;br /&gt;}\&lt;br /&gt;\&lt;br /&gt;int sglib___##type##_delete_recursive(type **tree, type *elem) {\&lt;br /&gt;  type  *t, *theLeaf;\&lt;br /&gt;  int       cmp, res, deepDecreased;\&lt;br /&gt;  t = *tree;\&lt;br /&gt;  res = 0;\&lt;br /&gt;  if (t==NULL) {\&lt;br /&gt;    assert(0 &amp;&amp; "The element to delete not found in the tree,  use 'delete_if_member'"!=NULL);\&lt;br /&gt;  } else {\&lt;br /&gt;    cmp = comparator(elem, t);\&lt;br /&gt;    if (cmp &lt; 0 || (cmp==0 &amp;&amp; elem&lt;t)) {\&lt;br /&gt;      deepDecreased = sglib___##type##_delete_recursive(&amp;t-&gt;left, elem);\&lt;br /&gt;      if (deepDecreased) {\&lt;br /&gt;        res = sglib___##type##_fix_left_deletion_discrepancy(tree);\&lt;br /&gt;      }\&lt;br /&gt;    } else if (cmp &gt; 0  || (cmp==0 &amp;&amp; elem&gt;t)) {\&lt;br /&gt;      deepDecreased = sglib___##type##_delete_recursive(&amp;t-&gt;right, elem);\&lt;br /&gt;      if (deepDecreased) {\&lt;br /&gt;        res = sglib___##type##_fix_right_deletion_discrepancy(tree);\&lt;br /&gt;      }\&lt;br /&gt;    } else {\&lt;br /&gt;      assert(elem==t &amp;&amp; "Deleting an element which is non member of the tree, use 'delete_if_member'"!=NULL);\&lt;br /&gt;      if (t-&gt;left == NULL) {\&lt;br /&gt;        if (t-&gt;right == NULL) {\&lt;br /&gt;          /* a leaf, delete, it; */\&lt;br /&gt;          *tree = NULL;\&lt;br /&gt;          res = (SGLIB___GET_VALUE(t-&gt;bits)==BLACK);\&lt;br /&gt;        } else {\&lt;br /&gt;          if (SGLIB___GET_VALUE(t-&gt;bits)==0 &amp;&amp; SGLIB___GET_VALUE(t-&gt;right-&gt;bits)==0) res = 1;\&lt;br /&gt;          SGLIB___SET_VALUE(t-&gt;right-&gt;bits,BLACK);\&lt;br /&gt;          *tree = t-&gt;right;\&lt;br /&gt;        }\&lt;br /&gt;      } else {\&lt;br /&gt;        /* propagate deletion until righmost leaf of left subtree */\&lt;br /&gt;        deepDecreased = sglib___##type##_delete_rightmost_leaf(&amp;t-&gt;left, &amp;theLeaf);\&lt;br /&gt;        theLeaf-&gt;left = t-&gt;left;\&lt;br /&gt;        theLeaf-&gt;right = t-&gt;right;\&lt;br /&gt;        SGLIB___SET_VALUE(theLeaf-&gt;bits,SGLIB___GET_VALUE(t-&gt;bits));\&lt;br /&gt;        *tree = theLeaf;\&lt;br /&gt;        if (deepDecreased) res = sglib___##type##_fix_left_deletion_discrepancy(tree);\&lt;br /&gt;      }\&lt;br /&gt;    }\&lt;br /&gt;  }\&lt;br /&gt;  return(res);\&lt;br /&gt;}\&lt;br /&gt;\&lt;br /&gt;void sglib_##type##_add(type **tree, type *elem) {\&lt;br /&gt;  elem-&gt;left = elem-&gt;right = NULL;\&lt;br /&gt;  sglib___##type##_add_recursive(tree, elem);\&lt;br /&gt;  SGLIB___SET_VALUE((*tree)-&gt;bits,BLACK);\&lt;br /&gt;}\&lt;br /&gt;\&lt;br /&gt;void sglib_##type##_delete(type **tree, type *elem) {\&lt;br /&gt;  sglib___##type##_delete_recursive(tree, elem);\&lt;br /&gt;  if (*tree!=NULL) SGLIB___SET_VALUE((*tree)-&gt;bits,BLACK);\&lt;br /&gt;}\&lt;br /&gt;\&lt;br /&gt;type *sglib_##type##_find_member(type *t, type *elem) {\&lt;br /&gt;  type *res;\&lt;br /&gt;  SGLIB___BIN_TREE_FIND_MEMBER(type, t, elem, left, right, comparator, res);\&lt;br /&gt;  return(res);\&lt;br /&gt;}\&lt;br /&gt;\&lt;br /&gt;int sglib_##type##_is_member(type *t, type *elem) {\&lt;br /&gt;  int       cmp;\&lt;br /&gt;  while (t!=NULL) {\&lt;br /&gt;    cmp = comparator(elem, t);\&lt;br /&gt;    if (cmp &lt; 0 || (cmp==0 &amp;&amp; elem&lt;t)) {\&lt;br /&gt;      t = t-&gt;left;\&lt;br /&gt;    } </description>
      <pubDate>Fri, 18 Jul 2008 00:58:08 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5784</guid>
      <author>taiar (Andr&#233; Taiar)</author>
    </item>
    <item>
      <title>Listing the files and subdirectories in C - Linux</title>
      <link>http://snippets.dzone.com/posts/show/5734</link>
      <description>// program lists the files and subdirectories within a given directory in full path&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;#include &lt;string.h&gt;&lt;br /&gt;#include &lt;dirent.h&gt;&lt;br /&gt;&lt;br /&gt;char *path_cat (const char *str1, char *str2);&lt;br /&gt;&lt;br /&gt;int main () {&lt;br /&gt;	struct dirent *dp;&lt;br /&gt;&lt;br /&gt;        // enter existing path to directory below&lt;br /&gt;	const char *dir_path="/path/to/directory/to/list";&lt;br /&gt;	DIR *dir = opendir(dir_path);&lt;br /&gt;	while ((dp=readdir(dir)) != NULL) {&lt;br /&gt;		char *tmp;&lt;br /&gt;		tmp = path_cat(dir_path, dp-&gt;d_name);&lt;br /&gt;		printf("%s\n", tmp);&lt;br /&gt;		free(tmp);&lt;br /&gt;		tmp=NULL;&lt;br /&gt;	}&lt;br /&gt;	closedir(dir);&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;char *path_cat (const char *str1, char *str2) {&lt;br /&gt;	size_t str1_len = strlen(str1);&lt;br /&gt;	size_t str2_len = strlen(str2);&lt;br /&gt;	char *result;&lt;br /&gt;	result = malloc((str1_len+str2_len+1)*sizeof *result);&lt;br /&gt;	strcpy (result,str1);&lt;br /&gt;	int i,j;&lt;br /&gt;	for(i=str1_len, j=0; ((i&lt;(str1_len+str2_len)) &amp;&amp; (j&lt;str2_len));i++, j++) {&lt;br /&gt;		result[i]=str2[j];&lt;br /&gt;	}&lt;br /&gt;	result[str1_len+str2_len]='\0';&lt;br /&gt;	return result;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 08 Jul 2008 01:13:50 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5734</guid>
      <author>Tvrtko (Tvrtko)</author>
    </item>
    <item>
      <title>C functions for getting disk space information in Linux OS</title>
      <link>http://snippets.dzone.com/posts/show/5601</link>
      <description>These are 2 C functions for getting disk capacity and disk free space in megabytes into char array&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include &lt;sys/statvfs.h&gt;&lt;br /&gt;#include &lt;glib.h&gt;&lt;br /&gt;&lt;br /&gt;gchar *&lt;br /&gt;g_get_capacity ( gchar * dev_path)&lt;br /&gt;{&lt;br /&gt;	unsigned long long result = 0;&lt;br /&gt;	int n;&lt;br /&gt;	gchar s_cap[50];&lt;br /&gt;	gchar * ss_cap = "N/A";&lt;br /&gt;	struct statvfs sfs;&lt;br /&gt;	if ( statvfs ( dev_path, &amp;sfs) != -1 )&lt;br /&gt;	{&lt;br /&gt;		result = (unsigned long long)sfs.f_bsize * sfs.f_blocks;&lt;br /&gt;	}&lt;br /&gt;	if (result &gt; 0)&lt;br /&gt;	{&lt;br /&gt;		double f_cap = (double)result/(1024*1024);&lt;br /&gt;		n = sprintf(s_cap, "%.2f Mb", f_cap);&lt;br /&gt;		ss_cap = g_strdup(s_cap);&lt;br /&gt;	}&lt;br /&gt;	return ss_cap;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;gchar * &lt;br /&gt;g_get_free_space ( gchar * dev_path)&lt;br /&gt;{&lt;br /&gt;	unsigned long long result = 0;&lt;br /&gt;	int n;&lt;br /&gt;	gchar s_cap[50];&lt;br /&gt;	gchar * ss_cap = "N/A";&lt;br /&gt;	struct statvfs sfs;&lt;br /&gt;	if ( statvfs ( dev_path, &amp;sfs) != -1 )&lt;br /&gt;	{&lt;br /&gt;		result = (unsigned long long)sfs.f_bsize * sfs.f_bfree;&lt;br /&gt;	}&lt;br /&gt;	if (result &gt; 0)&lt;br /&gt;	{&lt;br /&gt;		double f_cap = (double)result/(1024*1024);&lt;br /&gt;		n = sprintf(s_cap, "%.2f Mb", f_cap);&lt;br /&gt;		ss_cap = g_strdup(s_cap);&lt;br /&gt;	}&lt;br /&gt;	return ss_cap;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 06 Jun 2008 16:41:22 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5601</guid>
      <author>Tvrtko (Tvrtko)</author>
    </item>
    <item>
      <title>Fast anagram determination</title>
      <link>http://snippets.dzone.com/posts/show/5494</link>
      <description>// This function will determine whether the two C strings provided are anagrams or not. Only alphabetical strings are considered.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/******************************************************************************&lt;br /&gt; * This function is a code snippet. It can be freely used and distributed.&lt;br /&gt; * Author: irfan[dot]hamid[at]gmail[at]com&lt;br /&gt; *&lt;br /&gt; * This function takes two ASCII strings in C syntax (null-terminated&lt;br /&gt; * character arrays) and determines whether they are anagrams or not.&lt;br /&gt; *&lt;br /&gt; * Implementation notes:&lt;br /&gt; * The function contains a histogram that stores the frequency of each &lt;br /&gt; * character it encounters in the first string. For each character of the &lt;br /&gt; * second string, it decrements the corresponding entry in the histogram. If &lt;br /&gt; * before every decrement, the value of the histogram bucket reaches zero, &lt;br /&gt; * then the two strings are not anagrams, as there is some character that has&lt;br /&gt; * more occurrences in the second string than in the first string.&lt;br /&gt; *&lt;br /&gt; * If either of the two strings contains a non-alphabetic character, the&lt;br /&gt; * anagram property is considered to be violated.&lt;br /&gt; *&lt;br /&gt; * Remarks:&lt;br /&gt; * It is an efficient implementation because:&lt;br /&gt; *   o It is in-place, the original strings are not copied, no alloc or copy&lt;br /&gt; *   o Does not clobber the original strings&lt;br /&gt; *   o It is a linear time implementation&lt;br /&gt; *&lt;br /&gt; * Returns:&lt;br /&gt; * True if the strings are anagrams, false otherwise.&lt;br /&gt;******************************************************************************/&lt;br /&gt;&lt;br /&gt;bool is_anagram (char w1[], char w2[])&lt;br /&gt;{&lt;br /&gt;	unsigned int i, sz;&lt;br /&gt;&lt;br /&gt;	/* The histogram */&lt;br /&gt;	int freqtbl[26];&lt;br /&gt;&lt;br /&gt;	/* Sanity check */&lt;br /&gt;	if ((sz = strlen(w1)) != strlen(w2))&lt;br /&gt;		return false;&lt;br /&gt;&lt;br /&gt;	/* Initialize the histogram */&lt;br /&gt;	bzero(freqtbl, 26*sizeof(int));&lt;br /&gt;&lt;br /&gt;	/* Read the first string, incrementing the corresponding histogram entry */&lt;br /&gt;	for (i = 0; i &lt; sz; i++) {&lt;br /&gt;		if (w1[i] &gt;= 'A' &amp;&amp; w1[i] &lt;= 'Z')&lt;br /&gt;			freqtbl[w1[i]-'A']++;&lt;br /&gt;		else if (w1[i] &gt;= 'a' &amp;&amp; w1[i] &lt;= 'z')&lt;br /&gt;			freqtbl[w1[i]-'a']++;&lt;br /&gt;		else&lt;br /&gt;			return false;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* Read the second string, decrementing the corresponding histogram entry */&lt;br /&gt;	for (i = 0; i &lt; sz; i++) {&lt;br /&gt;		if (w2[i] &gt;= 'A' &amp;&amp; w2[i] &lt;= 'Z') {&lt;br /&gt;			if (freqtbl[w2[i]-'A'] == 0)&lt;br /&gt;				return false;&lt;br /&gt;			freqtbl[w2[i]-'A']--;&lt;br /&gt;		} else if (w2[i] &gt;= 'a' &amp;&amp; w2[i] &lt;= 'z') {&lt;br /&gt;			if (freqtbl[w2[i]-'a'] == 0)&lt;br /&gt;				return false;&lt;br /&gt;			freqtbl[w2[i]-'a']--;&lt;br /&gt;		} else {&lt;br /&gt;			return false;&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	return true;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 14 May 2008 23:40:31 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5494</guid>
      <author>phaana (Irfan Hamid)</author>
    </item>
    <item>
      <title>Pointer swap function</title>
      <link>http://snippets.dzone.com/posts/show/5423</link>
      <description>// A generic pointer swap function that works with all structs by calling swap(&amp;A, &amp;B), where A and B are struct pointers&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;void swap(void **x, void **y) {&lt;br /&gt;	void *t = *x;&lt;br /&gt;	*x = *y;&lt;br /&gt;	*y = t;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 23 Apr 2008 10:39:53 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5423</guid>
      <author>rasmus (Rasmus Frederiksen)</author>
    </item>
    <item>
      <title>A solution for the "Interpreter" problem</title>
      <link>http://snippets.dzone.com/posts/show/5246</link>
      <description>A solution for the "Interpreter" problem.&lt;br /&gt; &lt;br /&gt;Problem description:&lt;br /&gt;&lt;a href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10033.html"&gt;http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10033.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Author: &lt;a href="http://www.inf.ufrgs.br/~jmftrindade"&gt;Joana Matos Fonseca da Trindade&lt;/a&gt;&lt;br /&gt;Date: 2008.03.16&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/* &lt;br /&gt; * Solution for the "Interpreter" problem.&lt;br /&gt; * UVa ID: 10033&lt;br /&gt; */&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;#define MAX_REG 10&lt;br /&gt;#define MAX_RAM 1000&lt;br /&gt;&lt;br /&gt;int pointer;&lt;br /&gt;int regArray[MAX_REG];&lt;br /&gt;int ram[MAX_RAM];&lt;br /&gt;&lt;br /&gt;/* initialize registers and ram */&lt;br /&gt;int init() {&lt;br /&gt;	int i;&lt;br /&gt;	for (i = 0; i &lt; MAX_REG; i++) {&lt;br /&gt;		regArray[i] = 0;&lt;br /&gt;	}&lt;br /&gt;	for (i = 0; i &lt; MAX_RAM; i++) {&lt;br /&gt;		ram[i] = 0;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* decode instruction */&lt;br /&gt;int decode() {&lt;br /&gt;	int command, a1, a2;&lt;br /&gt;	command = ram[pointer] / 100;&lt;br /&gt;	a1 = (ram[pointer] % 100) / 10;&lt;br /&gt;	a2 = ram[pointer] % 10;&lt;br /&gt;	&lt;br /&gt;	switch (command) {&lt;br /&gt;		/* halt */&lt;br /&gt;		case 1 :		&lt;br /&gt;			return 0;&lt;br /&gt;			break;&lt;br /&gt;			&lt;br /&gt;		/* set register a1 to a2 */&lt;br /&gt;		case 2 :&lt;br /&gt;			regArray[a1] = a2;&lt;br /&gt;			pointer++;&lt;br /&gt;			break;&lt;br /&gt;			&lt;br /&gt;		/* add a2 to register a1 */&lt;br /&gt;		case 3 :&lt;br /&gt;			regArray[a1] = (regArray[a1] + a2) % 1000;&lt;br /&gt;			pointer++;&lt;br /&gt;			break;&lt;br /&gt;			&lt;br /&gt;		/* multiply register a1 by a2 */&lt;br /&gt;		case 4 :&lt;br /&gt;			regArray[a1] = (regArray[a1] * a2) % 1000;&lt;br /&gt;			pointer++;&lt;br /&gt;			break;&lt;br /&gt;			&lt;br /&gt;		/* set register a1 to the value of register a2 */&lt;br /&gt;		case 5 : &lt;br /&gt;			regArray[a1] = regArray[a2];&lt;br /&gt;			pointer++;&lt;br /&gt;			break;&lt;br /&gt;			&lt;br /&gt;		/* add the value of register a2 to register a1 */&lt;br /&gt;		case 6 : &lt;br /&gt;			regArray[a1] = (regArray[a1] + regArray[a2]) % 1000;&lt;br /&gt;			pointer++;&lt;br /&gt;			break;&lt;br /&gt;			&lt;br /&gt;		/* multiply register a1 by the value of register a2 */&lt;br /&gt;		case 7 :&lt;br /&gt;			regArray[a1] = (regArray[a1] * regArray[a2]) % 1000;&lt;br /&gt;			pointer++;&lt;br /&gt;			break;&lt;br /&gt;			&lt;br /&gt;		/* set register a1 to the value in RAM whose address is in register a2 */&lt;br /&gt;		case 8 :&lt;br /&gt;			regArray[a1] = ram[regArray[a2]];&lt;br /&gt;			pointer++;&lt;br /&gt;			break;			&lt;br /&gt;			&lt;br /&gt;		/* set the value in RAM whose address in in register a2 to that of register a1 */&lt;br /&gt;		case 9 :&lt;br /&gt;			ram[regArray[a2]] = regArray[a1];&lt;br /&gt;			pointer++;&lt;br /&gt;			break;			&lt;br /&gt;			&lt;br /&gt;		/* goto */		&lt;br /&gt;		case 0 :&lt;br /&gt;			if (regArray[a2] != 0) {&lt;br /&gt;				pointer = regArray[a1];&lt;br /&gt;			} else {&lt;br /&gt;				pointer++;&lt;br /&gt;			}&lt;br /&gt;			break;			&lt;br /&gt;			&lt;br /&gt;		default: &lt;br /&gt;			break;&lt;br /&gt;	}&lt;br /&gt;	return 1;	&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* main */&lt;br /&gt;int main (int argc, const char * argv[]) {&lt;br /&gt;	int i, j, cases, num_instr;&lt;br /&gt;	char instr[5];&lt;br /&gt;&lt;br /&gt;	scanf("%d", &amp;cases);&lt;br /&gt;	fgets(instr, sizeof(instr), stdin);&lt;br /&gt;	fgets(instr, sizeof(instr), stdin);&lt;br /&gt;	num_instr = 0;&lt;br /&gt;	&lt;br /&gt;	/* for the number of test cases specified */&lt;br /&gt;	for (i = 0; i &lt; cases; i++) {&lt;br /&gt;		init();&lt;br /&gt;		&lt;br /&gt;		pointer = 0;&lt;br /&gt;		&lt;br /&gt;		if (i != 0) {&lt;br /&gt;			printf("\n");&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		/* read input ram */&lt;br /&gt;		while(fgets(instr, sizeof(instr), stdin) != NULL) {&lt;br /&gt;			if (instr[0] == '\n') {&lt;br /&gt;				break;&lt;br /&gt;			}&lt;br /&gt;			ram[pointer] = (instr[0] - '0') * 100 + (instr[1] - '0') * 10 + (instr[2] - '0');&lt;br /&gt;			pointer++;&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		/* decode and interpret instructions until halt */&lt;br /&gt;		num_instr = 1;&lt;br /&gt;		pointer = 0;&lt;br /&gt;		while (decode()) {&lt;br /&gt;			num_instr++;&lt;br /&gt;		}	&lt;br /&gt;		&lt;br /&gt;		printf("%d\n",num_instr);	&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 18 Mar 2008 09:26:35 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5246</guid>
      <author>jmftrindade (Joana M. F. da Trindade)</author>
    </item>
    <item>
      <title>A solution for the "Graphical Editor" problem</title>
      <link>http://snippets.dzone.com/posts/show/5245</link>
      <description>A solution for the "Graphical Editor" problem.&lt;br /&gt; &lt;br /&gt;Problem description:&lt;br /&gt;&lt;a href="http://icpcres.ecs.baylor.edu/onlinejudge/external/102/10267.html"&gt;http://icpcres.ecs.baylor.edu/onlinejudge/external/102/10267.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Author: &lt;a href="http://www.inf.ufrgs.br/~jmftrindade"&gt;Joana Matos Fonseca da Trindade&lt;/a&gt;&lt;br /&gt;Date: 2008.03.12&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/* &lt;br /&gt; * Solution for the "Graphical Editor" problem.&lt;br /&gt; * UVa ID: 10267&lt;br /&gt; */&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;#define MAX 250&lt;br /&gt;#define OFFSET 1&lt;br /&gt;#define DOS_NAME 12&lt;br /&gt;&lt;br /&gt;/* global image bounds */&lt;br /&gt;int n, m;&lt;br /&gt;&lt;br /&gt;/* fills a rectangle with the specified color */&lt;br /&gt;int fillRectangle(int m_ini, int n_ini, int m_end, int n_end, char color, char pTable[][MAX+OFFSET]) {&lt;br /&gt;	int i, j;&lt;br /&gt;	for (i = n_ini; i &lt;= n_end; i++) {&lt;br /&gt;		for (j = m_ini; j &lt;= m_end; j++) {&lt;br /&gt;			pTable[i][j] = color;&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* fills a region R with the specified color */&lt;br /&gt;int fillRegion(int x, int y, char oldColor, char newColor, char pTable[][MAX+OFFSET]) {	&lt;br /&gt;	/* (x,y) is in region R */&lt;br /&gt;	pTable[y][x] = newColor;&lt;br /&gt;	&lt;br /&gt;	/* recursively check all 4 directions for neighbours of (x,y) with same color */&lt;br /&gt;	if ((pTable[y][x-1] == oldColor) &amp;&amp; (x &gt; OFFSET)) {         &lt;br /&gt;		fillRegion(x-1, y, oldColor, newColor, pTable);&lt;br /&gt;	}&lt;br /&gt;	if ((pTable[y][x+1] == oldColor) &amp;&amp; (x &lt; m)) {       &lt;br /&gt;		fillRegion(x+1, y, oldColor, newColor, pTable);&lt;br /&gt;	}&lt;br /&gt;	if ((pTable[y-1][x] == oldColor) &amp;&amp; (y &gt; OFFSET)) {        &lt;br /&gt;		fillRegion(x, y-1, oldColor, newColor, pTable);&lt;br /&gt;	}&lt;br /&gt;	if ((pTable[y+1][x] == oldColor) &amp;&amp; (y &lt; n)) {        &lt;br /&gt;		fillRegion(x, y+1, oldColor, newColor, pTable);&lt;br /&gt;	}&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* outputs the image */&lt;br /&gt;int printImage(int m, int n, char pTable[][MAX+OFFSET]) {&lt;br /&gt;	int i, j;	&lt;br /&gt;	for (i = OFFSET; i &lt; n+OFFSET; i++) {&lt;br /&gt;		for (j = OFFSET; j &lt; m+OFFSET; j++ ) {&lt;br /&gt;			printf("%c", pTable[i][j]);&lt;br /&gt;		}&lt;br /&gt;		printf("\n");&lt;br /&gt;	}&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* main */&lt;br /&gt;int main (int argc, const char * argv[]) {&lt;br /&gt;	/* the image */&lt;br /&gt;	char image[MAX+OFFSET][MAX+OFFSET];&lt;br /&gt;&lt;br /&gt;	/* editor command */&lt;br /&gt;	char command;&lt;br /&gt;	&lt;br /&gt;	/* coords */&lt;br /&gt;	int x1, x2, y1, y2, tmp;&lt;br /&gt;	&lt;br /&gt;	/* colors */&lt;br /&gt;	char color, oldColor;&lt;br /&gt;	&lt;br /&gt;	/* filename */&lt;br /&gt;	char filename[DOS_NAME+1];&lt;br /&gt;			&lt;br /&gt;	while(scanf("%c", &amp;command) != EOF) {		&lt;br /&gt;		/* X, terminates the session */&lt;br /&gt;		if (command == 'X') {&lt;br /&gt;			return 0;&lt;br /&gt;		}		&lt;br /&gt;		switch (command) {&lt;br /&gt;			/* create image */&lt;br /&gt;			case 'I' :&lt;br /&gt;				scanf("%d %d", &amp;m, &amp;n);&lt;br /&gt;				fillRectangle(1, 1, m, n, 'O', image);&lt;br /&gt;				break;&lt;br /&gt;			&lt;br /&gt;			/* clear image */&lt;br /&gt;			case 'C' :&lt;br /&gt;				fillRectangle(1, 1, m, n, 'O', image);&lt;br /&gt;				break;&lt;br /&gt;			&lt;br /&gt;			/* colors a pixel */&lt;br /&gt;			case 'L' :&lt;br /&gt;				scanf("%d %d %c", &amp;x1, &amp;y1, &amp;color);&lt;br /&gt;				image[y1][x1] = color;&lt;br /&gt;				break;&lt;br /&gt;			&lt;br /&gt;			/* draw vertical segment */&lt;br /&gt;			case 'V' :&lt;br /&gt;				scanf("%d %d %d %c", &amp;x1, &amp;y1, &amp;y2, &amp;color);&lt;br /&gt;				if (y2 &gt;= y1)&lt;br /&gt;					fillRectangle(x1, y1, x1, y2, color, image);&lt;br /&gt;				else&lt;br /&gt;					fillRectangle(x1, y2, x1, y1, color, image);&lt;br /&gt;				break;&lt;br /&gt;			&lt;br /&gt;			/* draw horizontal segment */&lt;br /&gt;			case 'H' : &lt;br /&gt;				scanf("%d %d %d %c", &amp;x1, &amp;x2, &amp;y1, &amp;color);&lt;br /&gt;				if (x2 &gt;= x1)&lt;br /&gt;					fillRectangle(x1, y1, x2, y1, color, image);&lt;br /&gt;				else&lt;br /&gt;					fillRectangle(x2, y1, x1, y1, color, image);&lt;br /&gt;				break;&lt;br /&gt;			&lt;br /&gt;			/* draw rectangle */&lt;br /&gt;			case 'K' : &lt;br /&gt;				scanf("%d %d %d %d %c", &amp;x1, &amp;y1, &amp;x2, &amp;y2, &amp;color);&lt;br /&gt;				if (x1 &gt;= x2) {&lt;br /&gt;					tmp = x1;&lt;br /&gt;					x1 = x2;&lt;br /&gt;					x2 = tmp;&lt;br /&gt;				}&lt;br /&gt;				if (y1 &gt;= y2) {&lt;br /&gt;					tmp = y1;&lt;br /&gt;					y1 = y2;&lt;br /&gt;					y2 = tmp;&lt;br /&gt;				}&lt;br /&gt;				fillRectangle(x1, y1, x2, y2, color, image);&lt;br /&gt;				break;&lt;br /&gt;			&lt;br /&gt;			/* fill */&lt;br /&gt;			case 'F' :&lt;br /&gt;				scanf("%d %d %c", &amp;x1, &amp;y1, &amp;color);&lt;br /&gt;				oldColor = image[y1][x1];&lt;br /&gt;				if (oldColor != color) {&lt;br /&gt;					fillRegion(x1, y1, oldColor, color, image);&lt;br /&gt;				}&lt;br /&gt;				break;&lt;br /&gt;&lt;br /&gt;			/* fill */&lt;br /&gt;			case 'S' :&lt;br /&gt;				scanf("%s", &amp;filename);&lt;br /&gt;				printf("%s\n", filename);&lt;br /&gt;				printImage(m, n, image);&lt;br /&gt;				break;			&lt;br /&gt;		&lt;br /&gt;			default: &lt;br /&gt;				break;&lt;br /&gt;		}		&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 18 Mar 2008 09:23:41 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5245</guid>
      <author>jmftrindade (Joana M. F. da Trindade)</author>
    </item>
    <item>
      <title>A solution for the "LCD Display" problem</title>
      <link>http://snippets.dzone.com/posts/show/5244</link>
      <description>A solution for the "LCD Display" problem.&lt;br /&gt; &lt;br /&gt;Problem description:&lt;br /&gt;&lt;a href="http://acm.uva.es/p/v7/706.html"&gt;http://acm.uva.es/p/v7/706.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Author: &lt;a href="http://www.inf.ufrgs.br/~jmftrindade"&gt;Joana Matos Fonseca da Trindade&lt;/a&gt;&lt;br /&gt;Date: 2008.03.09&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/* &lt;br /&gt; * Solution for the "LCD Display" problem.&lt;br /&gt; * UVa ID: 706&lt;br /&gt; */&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;string.h&gt;&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;&lt;br /&gt;#define MAX_SIZE 9&lt;br /&gt;&lt;br /&gt;int main (int argc, const char * argv[]) {&lt;br /&gt;	/* number of vertical or horizontal segments in each digit */&lt;br /&gt;	int s;&lt;br /&gt;	&lt;br /&gt;	/* the number to print */&lt;br /&gt;	char digitString[MAX_SIZE];&lt;br /&gt;	&lt;br /&gt;	/* &lt;br /&gt;	 * LED representation for each number, according to &lt;br /&gt;	 * the following convention:&lt;br /&gt;	 *&lt;br /&gt;	 *  -0-&lt;br /&gt;	 * |   |&lt;br /&gt;	 * 2   1&lt;br /&gt;	 * |   |&lt;br /&gt;	 *  -3-&lt;br /&gt;	 * |   |&lt;br /&gt;	 * 5   4&lt;br /&gt;	 * |   |&lt;br /&gt;	 *  -6-&lt;br /&gt;	 *&lt;br /&gt;	 */&lt;br /&gt;	&lt;br /&gt;	const char conversionTable[10][7] = {&lt;br /&gt;		      /* 0   1   2   3   4   5   6 */&lt;br /&gt;		/* 0 */ '-','|','|',' ','|','|','-',	  &lt;br /&gt;		/* 1 */ ' ','|',' ',' ','|',' ',' ',&lt;br /&gt;		/* 2 */ '-','|',' ','-',' ','|','-',&lt;br /&gt;		/* 3 */ '-','|',' ','-','|',' ','-',&lt;br /&gt;		/* 4 */ ' ','|','|','-','|',' ',' ',&lt;br /&gt;		/* 5 */ '-',' ','|','-','|',' ','-',&lt;br /&gt;		/* 6 */ '-',' ','|','-','|','|','-',&lt;br /&gt;		/* 7 */ '-','|',' ',' ','|',' ',' ',&lt;br /&gt;		/* 8 */ '-','|','|','-','|','|','-',&lt;br /&gt;		/* 9 */ '-','|','|','-','|',' ','-',&lt;br /&gt;&lt;br /&gt;	};&lt;br /&gt;	&lt;br /&gt;	/* iterators */&lt;br /&gt;	int i, j, k;&lt;br /&gt;	&lt;br /&gt;	while(scanf("%d %s", &amp;s, &amp;digitString) != EOF) {&lt;br /&gt;		&lt;br /&gt;		/* 0, ends the program */&lt;br /&gt;		if (!s) {&lt;br /&gt;			return 0;&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		int n = strlen(digitString);&lt;br /&gt;		int digit;&lt;br /&gt;		&lt;br /&gt;		for (i = 0; i &lt; 2*s+3; i++) {					&lt;br /&gt;			for (j = 0; j &lt; n; j ++) { &lt;br /&gt;						&lt;br /&gt;				digit = digitString[j] - '0';&lt;br /&gt;&lt;br /&gt;				/* upper, middle and lower parts */&lt;br /&gt;				if ((i % (s + 1)) == 0) {&lt;br /&gt;					printf(" ");&lt;br /&gt;					for (k = 0; k &lt; s; k++) {&lt;br /&gt;						printf("%c", conversionTable[digit][(i / (s + 1)) * 3]);&lt;br /&gt;					}&lt;br /&gt;					printf(" ");&lt;br /&gt;				}&lt;br /&gt;				&lt;br /&gt;				/* between upper and middle parts */&lt;br /&gt;				if (i &gt; 0 &amp;&amp; i &lt; (s + 1)) {&lt;br /&gt;					printf("%c", conversionTable[digit][2]);&lt;br /&gt;					for (k = 0; k &lt; s; k++) {&lt;br /&gt;						printf(" ");&lt;br /&gt;					}&lt;br /&gt;					printf("%c", conversionTable[digit][1]);&lt;br /&gt;				}&lt;br /&gt;&lt;br /&gt;				&lt;br /&gt;				/* between middle and lower parts */&lt;br /&gt;				if (i &gt; (s + 1) &amp;&amp; i &lt; (2*s + 2)) {&lt;br /&gt;					printf("%c", conversionTable[digit][5]);&lt;br /&gt;					for (k = 0; k &lt; s; k++) {&lt;br /&gt;						printf(" ");&lt;br /&gt;					}&lt;br /&gt;					printf("%c", conversionTable[digit][4]);&lt;br /&gt;				}&lt;br /&gt;				&lt;br /&gt;				/* if not the last number */&lt;br /&gt;				if (j != n-1)&lt;br /&gt;					printf(" ");&lt;br /&gt;	&lt;br /&gt;			}			&lt;br /&gt;			printf("\n");&lt;br /&gt;			&lt;br /&gt;		}&lt;br /&gt;		printf("\n");&lt;br /&gt;		&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 18 Mar 2008 09:16:55 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5244</guid>
      <author>jmftrindade (Joana M. F. da Trindade)</author>
    </item>
    <item>
      <title>A solution for "The Trip" problem</title>
      <link>http://snippets.dzone.com/posts/show/5207</link>
      <description>A solution for the Minesweeper problem.&lt;br /&gt; &lt;br /&gt;Problem description:&lt;br /&gt;&lt;a href="http://icpcres.ecs.baylor.edu/onlinejudge/external/101/10137.html"&gt;http://icpcres.ecs.baylor.edu/onlinejudge/external/101/10137.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Author: &lt;a href="http://www.inf.ufrgs.br/~jmftrindade"&gt;Joana Matos Fonseca da Trindade&lt;/a&gt;&lt;br /&gt;Date: 2008.03.08&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/* &lt;br /&gt; * A solution for "The Trip" problem.&lt;br /&gt; * UVa ID: 10137&lt;br /&gt; */&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;int main (int argc, const char * argv[]) {&lt;br /&gt;	/* number of students in the trip */&lt;br /&gt;	long numOfStudents;&lt;br /&gt;	&lt;br /&gt;	/* the total sum of money spent */&lt;br /&gt;	double total;&lt;br /&gt;	&lt;br /&gt;	/* the total amount of money to exchange in order to equalize */&lt;br /&gt;	double exchange;&lt;br /&gt;	&lt;br /&gt;	/* the equalized trip amount to be payed by each student */&lt;br /&gt;	double equalizedAmount;&lt;br /&gt;	&lt;br /&gt;	/* difference between the equalized amount and the amount spent */&lt;br /&gt;	double diff;&lt;br /&gt;	&lt;br /&gt;	/* sum of all negative differences */&lt;br /&gt;	double negativeSum;&lt;br /&gt;	&lt;br /&gt;	/* sum of all positive differences */&lt;br /&gt;	double positiveSum;&lt;br /&gt;	&lt;br /&gt;	/* iterator */&lt;br /&gt;	int i;&lt;br /&gt;	&lt;br /&gt;	while(scanf("%ld", &amp;numOfStudents) != EOF) {&lt;br /&gt;				&lt;br /&gt;		/* 0, ends the program */&lt;br /&gt;		if (!numOfStudents) {&lt;br /&gt;			return 0;&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		/* keeps the amount of money spent by each student */&lt;br /&gt;		double amountSpent[numOfStudents];		&lt;br /&gt;		&lt;br /&gt;		/* clean */&lt;br /&gt;		total = 0;&lt;br /&gt;		negativeSum = 0;&lt;br /&gt;		positiveSum = 0;&lt;br /&gt;				&lt;br /&gt;		for (i = 0; i &lt; numOfStudents; i++) {&lt;br /&gt;			scanf("%lf\n", &amp;amountSpent[i]);&lt;br /&gt;			total += amountSpent[i];&lt;br /&gt;		}&lt;br /&gt;				&lt;br /&gt;		equalizedAmount = total / numOfStudents;&lt;br /&gt;		&lt;br /&gt;		for (i = 0; i &lt; numOfStudents; i++) {&lt;br /&gt;			/* to ensure 0.01 precision */&lt;br /&gt;			diff = (double) (long) ((amountSpent[i] - equalizedAmount) * 100.0) / 100.0;&lt;br /&gt;			&lt;br /&gt;			if (diff &lt; 0) {&lt;br /&gt;				negativeSum += diff;&lt;br /&gt;			} else { &lt;br /&gt;				positiveSum += diff;&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		/* when the total amount is even, these sums do not differ. otherwise, they differ in one cent */&lt;br /&gt;		exchange = (-negativeSum &gt; positiveSum) ? -negativeSum : positiveSum;&lt;br /&gt;						&lt;br /&gt;		/* output result */&lt;br /&gt;		printf("$%.2lf\n", exchange);&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 09 Mar 2008 21:09:41 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5207</guid>
      <author>jmftrindade (Joana M. F. da Trindade)</author>
    </item>
  </channel>
</rss>
