⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sflsq.c

📁 Linux snort-2.4.4源代码
💻 C
字号:
/**   sflsq.c    **   Simple list, stack, queue, and dictionary implementations *   ( most of these implementations are list based - not performance monsters,*     and they all use malloc via s_malloc/s_free )**   Stack based Ineteger and Pointer Stacks, these are for*   performance.(inline would be better)**   Copyright(C) 2003 Sourcefire,Inc*   Marc Norton*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include "sflsq.h"/**  private malloc*/ static void * s_malloc (int n) {  void *p=0;  if( n > 0 )p = (void*) malloc( n );  return p;}/**  private free*/ static void s_free (void *p) {  if( p ) free( p );}/**   INIT - called by the NEW functions*/ void sflist_init ( SF_LIST * s) {  s->count=0;   s->head = s->tail = s->cur = 0;}/**    NEW*/SF_LIST * sflist_new() {   SF_LIST * s;   s = (SF_LIST*)s_malloc( sizeof(SF_LIST) );   if( s )sflist_init( s );   return s;}SF_STACK * sfstack_new() {   return (SF_STACK*)sflist_new();}SF_QUEUE * sfqueue_new() {   return (SF_QUEUE*)sflist_new();}/**     ADD to List/Stack/Queue/Dictionary*//**  Add-Head Item */ int sflist_add_head ( SF_LIST* s, NODE_DATA ndata ){  SF_LNODE * q;  if (!s->head)    {      q = s->tail = s->head = (SF_LNODE *) s_malloc (sizeof (SF_LNODE));      if(!q)return -1;      q->ndata = (NODE_DATA)ndata;      q->next = 0;      q->prev = 0;    }  else    {      q = (SF_LNODE *) s_malloc (sizeof (SF_LNODE));      if(!q)return -1;      q->ndata = ndata;      q->next = s->head;      q->prev = 0;      s->head->prev = q;      s->head = q;    }  s->count++;  return 0;}/**  Add-Tail Item */ int sflist_add_tail ( SF_LIST* s, NODE_DATA ndata ){  SF_LNODE * q;  if (!s->head)    {      q = s->tail = s->head = (SF_LNODE *) s_malloc (sizeof (SF_LNODE));      if(!q)return -1;      q->ndata = (NODE_DATA)ndata;      q->next = 0;      q->prev = 0;    }  else    {      q = (SF_LNODE *) s_malloc (sizeof (SF_LNODE));      if(!q)return -1;      q->ndata = ndata;      q->next = 0;      q->prev = s->tail;      s->tail->next = q;      s->tail = q;    }  s->count++;  return 0;}/**  Add-Head Item */ int sflist_add_before ( SF_LIST* s, SF_LNODE * lnode, NODE_DATA ndata ){  SF_LNODE * q;  if( !lnode )      return 0;  /* Add to head of list */  if( s->head == lnode )  {      return sflist_add_head ( s, ndata );  }  else  {      q = (SF_LNODE *) s_malloc ( sizeof (SF_LNODE) );      if( !q )      {          return -1;      }      q->ndata = (NODE_DATA)ndata;      q->next = lnode;      q->prev = lnode->prev;      lnode->prev->next = q;      lnode->prev       = q;  }  s->count++;  return 0;}/**/int sfqueue_add(SF_QUEUE * s, NODE_DATA ndata ) {  return sflist_add_tail ( s, ndata );}int sfstack_add( SF_STACK* s, NODE_DATA ndata ) {  return sflist_add_tail ( s, ndata );}/* *   List walk - First/Next - return the node data or NULL*/NODE_DATA sflist_first( SF_LIST * s ){    s->cur = s->head;    if( s->cur )         return s->cur->ndata;    return 0;}NODE_DATA sflist_next( SF_LIST * s ){    if( s->cur )    {        s->cur = s->cur->next;        if( s->cur )             return s->cur->ndata;    }    return 0;}NODE_DATA sflist_prev( SF_LIST * s ){    if( s->cur )    {        s->cur = s->cur->prev;        if( s->cur )             return s->cur->ndata;    }    return 0;}/* *   List walk - First/Next - return the node data or NULL*/SF_LNODE * sflist_first_node( SF_LIST * s ){    s->cur = s->head;    if( s->cur )         return s->cur;    return 0;}SF_LNODE * sflist_next_node( SF_LIST * s ){    if( s->cur )    {        s->cur = s->cur->next;        if( s->cur )             return s->cur;    }    return 0;}/**  Remove Head Item from list*/ NODE_DATA sflist_remove_head (SF_LIST * s) {  NODE_DATA ndata = 0;  SF_QNODE * q;  if (s->head)    {      q = s->head;      ndata = q->ndata;      s->head = s->head->next;      s->count--;      if (!s->head)	  {	    s->tail = 0;	    s->count = 0;	  }      s_free( q );    }  return (NODE_DATA)ndata;}/**  Remove tail Item from list*/ NODE_DATA sflist_remove_tail (SF_LIST * s) {  NODE_DATA ndata = 0;  SF_QNODE * q;  if (s->tail)    {      q = s->tail;      ndata = q->ndata;      s->count--;      s->tail = q->prev;       if (!s->tail)      {	    s->tail = 0;        s->head = 0;	    s->count = 0;      }      else       {        q->prev->next = 0;      }      s_free (q);    }  return (NODE_DATA)ndata;}/* * Written to remove current node from an SFLIST * MFR - 29May04 */NODE_DATA sflist_remove_current (SF_LIST * s) {    NODE_DATA ndata = NULL;    SF_LNODE *l;    l = s->cur;        if(l)    {        ndata = l->ndata;        if(l->prev)        {            l->prev->next = l->next;            s->cur = l->prev;        }        else        {            s->head = l->next;            s->cur = l->next;        }        if(l->next)            l->next->prev = l->prev;        else            s->tail = l->prev;        s->count--;        s_free(l);        return (NODE_DATA)ndata;    }    return NULL;}/**  Remove Head Item from queue*/ NODE_DATA sfqueue_remove (SF_QUEUE * s) {  return (NODE_DATA)sflist_remove_head( s );}/**  Remove Tail Item from stack*/ NODE_DATA sfstack_remove (SF_QUEUE * s) {  return (NODE_DATA)sflist_remove_tail( s );}/**  COUNT*/ int sfqueue_count (SF_QUEUE * s) {  if(!s)return 0;  return s->count;}int sflist_count ( SF_LIST* s) {  if(!s)return 0;  return s->count;}int sfstack_count ( SF_STACK * s) {  if(!s)return 0;  return s->count;}/**   Free List + Free it's data nodes using 'nfree' */void sflist_free_all( SF_LIST * s, void (*nfree)(void*) ) {  void * p;  while( sflist_count(s) )  {    p = sflist_remove_head (s);	if(p)nfree(p);  }}void sfqueue_free_all(SF_QUEUE * s,void (*nfree)(void*) ) {  sflist_free_all( s, nfree ); }void sfstack_free_all(SF_STACK * s,void (*nfree)(void*) ) {  sflist_free_all( s, nfree ); }/**  FREE List/Queue/Stack/Dictionary**  This does not free a nodes data*/ void sflist_free (SF_LIST * s){  while( sflist_count(s) )  {    sflist_remove_head (s);  }}void sfqueue_free (SF_QUEUE * s) {  sflist_free ( s ); }void sfstack_free (SF_STACK * s){  sflist_free ( s ); }/**   Integer stack functions - for performance scenarios*/int sfistack_init( SF_ISTACK * s, unsigned * a,  int n  ){   s->imalloc=0;   if( a ) s->stack = a;   else   {      s->stack = (unsigned*) malloc( n * sizeof(unsigned) );      s->imalloc=1;   }   if( !s->stack ) return -1;   s->nstack= n;   s->n =0;   return 0;}int sfistack_push( SF_ISTACK *s, unsigned value){   if( s->n < s->nstack )   {       s->stack[s->n++] = value;       return 0;   }   return -1;}int sfistack_pop( SF_ISTACK *s, unsigned * value){   if( s->n > 0 )   {       s->n--;       *value = s->stack[s->n];       return 0;   }   return -1;}/**  Pointer Stack Functions - for performance scenarios*/int sfpstack_init( SF_PSTACK * s, void ** a,  int n  ){   s->imalloc=0;   if( a ) s->stack = a;   else   {      s->stack = (void**) malloc( n * sizeof(void*) );      s->imalloc=1;   }   if( !s->stack ) return -1;   s->nstack= n;   s->n =0;   return 0;}int sfpstack_push( SF_PSTACK *s, void * value){   if( s->n < s->nstack )   {       s->stack[s->n++] = value;       return 0;   }   return -1;}int sfpstack_pop( SF_PSTACK *s, void ** value){   if( s->n > 0 )   {       s->n--;       *value = s->stack[s->n];       return 0;   }   return -1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -