Edit

IABSD.fr/xenocara/app/ssh-askpass/dynlist.c

Branch :

  • Show log

    Commit

  • Author : matthieu
    Date : 2006-11-26 10:53:04
    Hash : 3458219f
    Message : Importing from XF4, plus BSD make infrastructure

  • app/ssh-askpass/dynlist.c
  • /* dynlist.c: Dynamic lists and buffers in C.
     * created 1999-Jan-06 15:34 jmk
     * autodate: 2000-Aug-28 01:29
     * 
     * by Jim Knoble <jmknoble@jmknoble.cx>
     * Copyright (C) 1999,2000 Jim Knoble
     * 
     * Disclaimer:
     * 
     * The software is provided "as is", without warranty of any kind,
     * express or implied, including but not limited to the warranties of
     * merchantability, fitness for a particular purpose and
     * noninfringement. In no event shall the author(s) be liable for any
     * claim, damages or other liability, whether in an action of
     * contract, tort or otherwise, arising from, out of or in connection
     * with the software or the use or other dealings in the software.
     * 
     * Permission to use, copy, modify, distribute, and sell this software
     * and its documentation for any purpose is hereby granted without
     * fee, provided that the above copyright notice appear in all copies
     * and that both that copyright notice and this permission notice
     * appear in supporting documentation.
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #include "dynlist.h"
    
    #define LIST_CHUNK_SIZE		512
    #define BUF_CHUNK_SIZE		512
    
    /* For lists of pointers cast to char *. */
    int append_to_list(char ***list_ptr, int *list_len, int *i, char *item)
    {
       char **tmp_ptr;
       
       if (*i >= *list_len)
        {
           *list_len += LIST_CHUNK_SIZE;
           tmp_ptr = realloc(*list_ptr, (sizeof(**list_ptr) * *list_len));
           if (NULL == tmp_ptr)
    	{
    	   free(*list_ptr);
    	   *list_ptr = NULL;
    	   return(APPEND_FAILURE);
    	} else {
    	   *list_ptr = tmp_ptr;
    	}
           *list_ptr = tmp_ptr;
        }
       (*list_ptr)[*i] = item;
       (*i)++;
       return(APPEND_SUCCESS);
    }
    
    /* For single-dimensional buffers. */
    int append_to_buf(char **buf, int *buflen, int *i, int c)
    {
       char *tmp_buf;
       
       if (*i >= *buflen)
        {
           *buflen += BUF_CHUNK_SIZE;
           tmp_buf = realloc(*buf, (sizeof(**buf) * *buflen));
           if (NULL == tmp_buf)
    	{
    	   free(*buf);
    	   *buf = NULL;
    	   return(APPEND_FAILURE);
    	} else {
    	   *buf = tmp_buf;
    	}
           *buf = tmp_buf;
    #ifdef DEBUG
           printf("-->Allocated buffer of size %d\n", *buflen);
    #endif /* DEBUG */
        }
       (*buf)[*i] = (char) c;
       (*i)++;
       return(APPEND_SUCCESS);
    }