Logo Search packages:      
Sourcecode: haproxy version File versions  Download package

hdr_idx.c

/*
 * Header indexation functions.
 *
 * Copyright 2000-2006 Willy Tarreau <w@1wt.eu>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version
 * 2 of the License, or (at your option) any later version.
 *
 */

#include <common/config.h>
#include <types/hdr_idx.h>


/*
 * Add a header entry to <list> after element <after>. <after> is ignored when
 * the list is empty or full. Common usage is to set <after> to list->tail.
 *
 * Returns the position of the new entry in the list (from 1 to size-1), or 0
 * if the array is already full. An effort is made to fill the array linearly,
 * but once the last entry has been used, we have to search for unused blocks,
 * which takes much more time. For this reason, it's important to size is
 * appropriately.
 */
int hdr_idx_add(int len, int cr, struct hdr_idx *list, int after)
{
      register struct hdr_idx_elem e = { .len=0, .cr=0, .next=0};
      int new;

      e.len = len;
      e.cr = cr;

      if (list->used == list->size) {
            /* list is full */
            return -1;
      }


      if (list->last < list->size) {
            /* list is not completely used, we can fill linearly */
            new = list->last++;
      } else {
            /* That's the worst situation :
             * we have to scan the list for holes. We know that we
             * will find a place because the list is not full.
             */
            new = 1;
            while (list->v[new].len)
                  new++;
      }
      
      /* insert the new element between <after> and the next one (or end) */
      e.next = list->v[after].next;
      list->v[after].next = new;

      list->used++;
      list->v[new] = e;
      list->tail = new;
      return new;
}


/*
 * Local variables:
 *  c-indent-level: 8
 *  c-basic-offset: 8
 * End:
 */

Generated by  Doxygen 1.6.0   Back to index