libacpi: list.c Source File

- Main Page
- Classes
- Files

- File List
- File Members

# list.c

Go to the documentation of this file.

    00001 /*
    00002  * (C)opyright 2007 Nico Golde <nico@ngolde.de>
    00003  * See LICENSE file for license details
    00004  * This is no complete linked list implementation, it is just used
    00005  * to get a list of directory entries and delete the list
    00006  */
    00007
    00008 #include <stdio.h>
    00009 #include <string.h>
    00010 #include <stdlib.h>
    00011 #include <dirent.h>
    00012
    00013 #include "list.h"
    00014
    00015 /* create a new list */
    00016 static list_t *
    00017 new_list(void){
    00018         list_t *l = malloc(sizeof(list_t));
    00019         if(!l) return NULL;
    00020         l->top = l->last = NULL;
    00021         l->length = 0;
    00022         return l;
    00023 }
    00024
    00025 static void
    00026 append_node(list_t *lst, char *name){
    00027         node_t *n;
    00028         if(!lst) return;
    00029         if((n = malloc(sizeof(node_t))) == NULL) return;
    00030         if((n->name = strdup(name)) == NULL) {
    00031                 free(n);
    00032                 return;
    00033         }
    00034         n->next = NULL;
    00035         if(lst->top){
    00036                 lst->last->next = n;
    00037                 lst->last = lst->last->next;
    00038         } else {
    00039                 lst->top = lst->last = n;
    00040         }
    00041         lst->length++;
    00042 }
    00043
    00044 /* delete the whole list */
    00045 void
    00046 delete_list(list_t *lst){
    00047         node_t *tmp;
    00048         tmp = lst->top;
    00049         while(tmp != NULL){
    00050                 lst->top = tmp->next;
    00051                 if(tmp->name) free(tmp->name);
    00052                 free(tmp);
    00053                 tmp = lst->top;
    00054         }
    00055         lst->top = lst->last = NULL;
    00056         free(lst);
    00057 }
    00058
    00059 /* return a linked list with directory entries or NULL on error */
    00060 list_t *
    00061 dir_list(char *dir){
    00062         list_t *list = new_list();
    00063         DIR *rddir = NULL;
    00064         struct dirent *rd;
    00065
    00066         if((rddir = opendir(dir)) == NULL)
    00067                 return NULL;
    00068         while((rd = readdir(rddir))){
    00069                 if(!strncmp(".", rd->d_name, 1) || !strncmp("..", rd->d_name, 2))
    00070                         continue;
    00071
    00072                 append_node(list, rd->d_name);
    00073         }
    00074         closedir(rddir);
    00075         return list;
    00076 }