summaryrefslogtreecommitdiff
path: root/modules/functions/src/c/libraryinfo.c
blob: 7d0313f6f955d2e818fc1ac050924a03dd729f88 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 * Copyright (C) 2006 - INRIA - Allan CORNET
 * Copyright (C) 2010 - DIGITEO - Allan CORNET
 *
 * This file must be used under the terms of the CeCILL.
 * This source file is licensed as described in the file COPYING, which
 * you should have received as part of this distribution.  The terms
 * are also available at
 * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 *
 */
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "PATH_MAX.h"
#include "stack-c.h"
#include "libraryinfo.h"
#include "stackinfo.h"
#include "MALLOC.h"
#include "cvstr.h"
#include "expandPathVariable.h"
#ifdef _MSC_VER
#include "strdup_windows.h"
#endif
#include "charEncoding.h"
/*--------------------------------------------------------------------------*/
char *getlibrarypath(char *libraryname)
{
    char *path = NULL;
    int lw = 0;
    int fin = 0;

    if (C2F(objptr)(libraryname, &lw, &fin, (unsigned long)strlen(libraryname)))
    {
        int *header = istk(iadr(*Lstk(fin)));
        if ( (header) && (header[0] == sci_lib ) )
        {
            int lengthpath = 0, job = 0;

            lengthpath = header[1];
            path = (char *) MALLOC((lengthpath + 1) * sizeof(char));

            job = 1; /* convert scilab to ascii */
            C2F(cvstr)(&lengthpath, &header[2], path, &job, lengthpath);
            path[lengthpath] = '\0';
        }
    }
    return path;
}
/*--------------------------------------------------------------------------*/
char **getlistmacrosfromlibrary(char *libraryname, int *sizearray)
{
    char **macroslist = NULL;
    char *pathlibrary = getlibrarypath(libraryname);

    if (pathlibrary)
    {
        /* in each library directory , we have a "names" file with list of macros */
#define filenameNAMES "names"
        char *expandedpath = expandPathVariable(pathlibrary);

        if (expandedpath)
        {
            char *fullfilename = (char*)MALLOC(sizeof(char) * (strlen(expandedpath) + strlen(filenameNAMES) + 1));
            if (fullfilename)
            {
                char  line[PATH_MAX + 1];
                FILE * pFile = NULL;
                int nbElements = 0;

                sprintf(fullfilename, "%s%s", expandedpath, filenameNAMES);

                wcfopen (pFile, fullfilename, "rt");
                if (pFile)
                {
                    while (fgets (line, sizeof(line), pFile) != NULL)
                    {
                        /* remove carriage return */
                        char *pos = strchr(line, '\n');
                        if (pos)
                        {
                            *pos = 0;
                        }

                        pos = strchr(line, '\r');
                        if (pos)
                        {
                            *pos = 0;
                        }

                        if (macroslist)
                        {
                            macroslist = (char**)REALLOC(macroslist, sizeof(char*) * (nbElements + 1));
                        }
                        else
                        {
                            macroslist = (char**)MALLOC(sizeof(char*) * (nbElements + 1));
                        }

                        macroslist[nbElements] = strdup(line);
                        nbElements++;
                    }
                    fclose(pFile);
                    *sizearray = nbElements;
                }
                FREE(fullfilename);
                fullfilename = NULL;
            }
            FREE(expandedpath);
            expandedpath = NULL;
        }

        FREE(pathlibrary);
        pathlibrary = NULL;
    }
    else
    {
        *sizearray = 0;
    }
    return macroslist;
}
/*--------------------------------------------------------------------------*/