aboutsummaryrefslogtreecommitdiff
path: root/src/functiondirs.cpp
blob: b2fc8677185c25e6e378780aefdf3ea6f2229790 (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
/*
 * Copyright (C) 2007-2014 Xagasoft, All rights reserved.
 *
 * This file is part of the Xagasoft Build and is released under the
 * terms of the license contained in the file LICENSE.
 */

#include "functiondirs.h"

#include <sys/types.h> 
#include <sys/stat.h> 
#include <glob.h>
#include <unistd.h>

#include <bu/plugger.h>
PluginInterface3( pluginFunctionDirs, dirs, FunctionDirs, Function,
        "Mike Buland", 0, 1 );

FunctionDirs::FunctionDirs()
{
}

FunctionDirs::~FunctionDirs()
{
}

Bu::String FunctionDirs::getName() const
{
    return "dirs";
}

Variable FunctionDirs::call( Variable &/*input*/, VarList lParams )
{
    glob_t globbuf;

    int flags = 0;

    for( VarList::const_iterator i = lParams.begin(); i; i++ )
    {
        switch( (*i).getType() )
        {
            case Variable::typeString:
                glob( (*i).getString().getStr(), flags, NULL, &globbuf );
                flags |= GLOB_APPEND;
                break;

            case Variable::typeList:
                throw Bu::ExceptionBase("Lists not supported in glob yet.");
                break;

            default:
                throw Bu::ExceptionBase(
                    "Cannot use a non-string or non-list as a parameter to glob"
                    );
                break;
        }
    }

    Variable vRet( Variable::typeList );
    struct stat s;
    for( size_t j = 0; j < globbuf.gl_pathc; j++ )
    {
        stat( globbuf.gl_pathv[j], &s );
        if( S_ISDIR( s.st_mode ) )
            vRet.append( globbuf.gl_pathv[j] );
    }

    globfree( &globbuf );

    return vRet;
}