archiveList complete with gateways, primitives, test and help
[scilab.git] / scilab / modules / fileio / src / c / archive_list.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2015 - Kartik Gupta
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  *
11  */
12
13 #include<archive.h>
14 #include<stdio.h>
15 #include<stdlib.h>
16 #include<archive_entry.h>
17 #include<string.h>
18 #include "MALLOC.h"
19
20 char** archive_list(char *filename, int *size, int *error)
21 {
22     struct archive *a;
23     struct archive_entry *entry;
24     int r;
25     a = archive_read_new();
26     archive_read_support_filter_all(a);
27     archive_read_support_format_all(a);
28     r = archive_read_open_filename(a, filename, 10240);    //Opening the archive to read the headers
29     char **file_list;
30
31
32     if (r != ARCHIVE_OK) //If the archive could not be opened
33     {
34         *error = 1;
35         return file_list;
36     }
37     *size = 0;
38
39
40     while (archive_read_next_header(a, &entry) == ARCHIVE_OK)
41     {   //Iterating over the archive header to get filenames
42         *size = *size + 1;
43         if((*size) == 1)
44         {
45             file_list = (char**)MALLOC(sizeof(char*)*(*size));
46         }
47         else
48         {
49             file_list = (char**)REALLOC(file_list,sizeof(char*)*(*size));
50         }
51         file_list[(*size)-1] = (char*)MALLOC(sizeof(char)*1024);
52         file_list[(*size)-1] = NULL;
53         file_list[(*size)-1] = strdup(archive_entry_pathname(entry));
54         archive_read_data_skip(a);
55     }
56
57
58     r = archive_read_free(a); 
59     if (r != ARCHIVE_OK) //If the archive struct could not be freed properly
60     {
61         *error = 2;
62         return file_list;
63     }
64
65
66     return file_list;
67 }