~ubuntu-branches/ubuntu/precise/stellarium/precise

« back to all changes in this revision

Viewing changes to src/external/kdewin32/dirent.c

  • Committer: Bazaar Package Importer
  • Author(s): Cédric Delfosse
  • Date: 2009-03-13 20:07:22 UTC
  • mfrom: (1.1.8 upstream) (4.1.2 squeeze)
  • Revision ID: james.westby@ubuntu.com-20090313200722-l66s4zy2s3e8up0s
Tags: 0.10.2-1
New upstream release

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* ====================================================================
 
2
 * The Apache Software License, Version 1.1
 
3
 *
 
4
 * Copyright (c) 2000-2002 The Apache Software Foundation.  All rights
 
5
 * reserved.
 
6
 *
 
7
 * Redistribution and use in source and binary forms, with or without
 
8
 * modification, are permitted provided that the following conditions
 
9
 * are met:
 
10
 *
 
11
 * 1. Redistributions of source code must retain the above copyright
 
12
 *    notice, this list of conditions and the following disclaimer.
 
13
 *
 
14
 * 2. Redistributions in binary form must reproduce the above copyright
 
15
 *    notice, this list of conditions and the following disclaimer in
 
16
 *    the documentation and/or other materials provided with the
 
17
 *    distribution.
 
18
 *
 
19
 * 3. The end-user documentation included with the redistribution,
 
20
 *    if any, must include the following acknowledgment:
 
21
 *       "This product includes software developed by the
 
22
 *        Apache Software Foundation (http://www.apache.org/)."
 
23
 *    Alternately, this acknowledgment may appear in the software itself,
 
24
 *    if and wherever such third-party acknowledgments normally appear.
 
25
 *
 
26
 * 4. The names "Apache" and "Apache Software Foundation" must
 
27
 *    not be used to endorse or promote products derived from this
 
28
 *    software without prior written permission. For written
 
29
 *    permission, please contact apache@apache.org.
 
30
 *
 
31
 * 5. Products derived from this software may not be called "Apache",
 
32
 *    nor may "Apache" appear in their name, without prior written
 
33
 *    permission of the Apache Software Foundation.
 
34
 *
 
35
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 
36
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 
37
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 
38
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 
39
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 
40
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 
41
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 
42
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 
43
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 
44
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 
45
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 
46
 * SUCH DAMAGE.
 
47
 * ====================================================================
 
48
 *
 
49
 * This software consists of voluntary contributions made by many
 
50
 * individuals on behalf of the Apache Software Foundation.  For more
 
51
 * information on the Apache Software Foundation, please see
 
52
 * <http://www.apache.org/>.
 
53
 *
 
54
 * Portions of this software are based upon public domain software
 
55
 * originally written at the National Center for Supercomputing Applications,
 
56
 * University of Illinois, Urbana-Champaign.
 
57
 */
 
58
 
 
59
#include <windows.h>
 
60
#include <malloc.h>
 
61
 
 
62
#include "kdewin32/string.h"
 
63
#include "kdewin32/errno.h"
 
64
 
 
65
#include "kdewin32/dirent.h"
 
66
 
 
67
/**********************************************************************
 
68
 * Implement dirent-style opendir/readdir/closedir on Window 95/NT
 
69
 *
 
70
 * Functions defined are opendir(), readdir() and closedir() with the
 
71
 * same prototypes as the normal dirent.h implementation.
 
72
 *
 
73
 * Does not implement telldir(), seekdir(), rewinddir() or scandir(). 
 
74
 * The dirent struct is compatible with Unix, except that d_ino is 
 
75
 * always 1 and d_off is made up as we go along.
 
76
 *
 
77
 * The DIR typedef is not compatible with Unix.
 
78
 **********************************************************************/
 
79
 
 
80
#ifndef __MINGW32__
 
81
 
 
82
DIR * opendir(const char *dir)
 
83
{
 
84
    DIR *dp;
 
85
    char *filespec;
 
86
    long handle;
 
87
    int index;
 
88
 
 
89
    filespec = malloc(strlen(dir) + 2 + 1);
 
90
    strcpy(filespec, dir);
 
91
    index = strlen(filespec) - 1;
 
92
    if (index >= 0 && (filespec[index] == '/' || filespec[index] == '\\'))
 
93
        filespec[index] = '\0';
 
94
    strcat(filespec, "\\*");
 
95
 
 
96
    dp = (DIR *)malloc(sizeof(DIR));
 
97
    dp->offset = 0;
 
98
    dp->finished = 0;
 
99
    dp->dir = strdup(dir);
 
100
 
 
101
    if ((handle = _findfirst(filespec, &(dp->fileinfo))) < 0) {
 
102
        if (errno == ENOENT)
 
103
            dp->finished = 1;
 
104
        else
 
105
        return NULL;
 
106
    }
 
107
 
 
108
    dp->handle = handle;
 
109
    free(filespec);
 
110
 
 
111
    return dp;
 
112
}
 
113
 
 
114
struct dirent * readdir(DIR *dp)
 
115
{
 
116
    if (!dp || dp->finished) return NULL;
 
117
 
 
118
    if (dp->offset != 0) {
 
119
        if (_findnext(dp->handle, &(dp->fileinfo)) < 0) {
 
120
            dp->finished = 1;
 
121
            /* posix does not set errno in this case */
 
122
            errno = 0;
 
123
            return NULL;
 
124
        }
 
125
    }
 
126
    dp->offset++;
 
127
 
 
128
    strncpy(dp->dent.d_name, dp->fileinfo.name, _MAX_FNAME);
 
129
#ifdef KDEWIN32_HAVE_DIRENT_D_TYPE
 
130
    dp->dent.d_type = DT_UNKNOWN;
 
131
#endif    
 
132
    dp->dent.d_ino = 1;
 
133
    dp->dent.d_reclen = strlen(dp->dent.d_name);
 
134
    dp->dent.d_off = dp->offset;
 
135
 
 
136
    return &(dp->dent);
 
137
}
 
138
 
 
139
int closedir(DIR *dp)
 
140
{
 
141
    if (!dp) return 0;
 
142
    if ((HANDLE)dp->handle != INVALID_HANDLE_VALUE) _findclose(dp->handle);
 
143
    if (dp->dir) free(dp->dir);
 
144
    if (dp) free(dp);
 
145
 
 
146
    return 0;
 
147
}
 
148
 
 
149
#endif // #ifndef __MINGW32__