3 ** This program is distributed under the GNU General Public License, version 2.
4 ** A copy of this license is included with this source.
6 ** Copyright 2000, Michael Smith <msmith@xiph.org>
8 ** Portions from Vorbize, (c) Kenneth Arnold <kcarnold-xiph@arnoldnet.net>
9 ** and libvorbis examples, (c) Monty <monty@xiph.org>
11 ** last mod: $Id: platform.c,v 1.2 2005-06-19 02:52:40+09 blacksword Exp $
15 /* Platform support routines - win32, OS/2, unix */
26 #if defined(_WIN32) || defined(__EMX__) || defined(__WATCOMC__)
32 #if defined(_WIN32) && defined(_MSC_VER)
34 void setbinmode(FILE *f
)
36 _setmode( _fileno(f
), _O_BINARY
);
41 void setbinmode(FILE *f
)
47 #if defined(__WATCOMC__) || defined(__BORLANDC__) || defined(__MINGW32__)
48 void setbinmode(FILE *f
)
50 setmode(fileno(f
), O_BINARY
);
55 #if defined(_WIN32) || defined(__EMX__) || defined(__WATCOMC__)
58 void *timer_start(void)
60 DWORD
*start
= malloc(sizeof(DWORD
));
61 *start
= timeGetTime();
65 double timer_time(void *timer
)
67 ogg_int64_t now
= (ogg_int64_t
)timeGetTime();
68 ogg_int64_t start
= (ogg_int64_t
)(*(DWORD
*)timer
);
73 return (double)(now
)/1000.0;
79 void timer_clear(void *timer
)
84 void *timer_start(void)
86 time_t *start
= malloc(sizeof(time_t));
91 double timer_time(void *timer
)
93 time_t now
= time(NULL
);
94 time_t start
= *((time_t *)timer
);
97 return (double)(now
-start
);
99 return 1; /* To avoid division by zero later, for very short inputs */
103 void timer_clear(void *timer
)
105 free((time_t *)timer
);
109 #else /* unix. Or at least win32 */
111 #include <sys/time.h>
114 void *timer_start(void)
116 struct timeval
*start
= malloc(sizeof(struct timeval
));
117 gettimeofday(start
, NULL
);
118 return (void *)start
;
121 double timer_time(void *timer
)
124 struct timeval start
= *((struct timeval
*)timer
);
126 gettimeofday(&now
, NULL
);
128 return (double)now
.tv_sec
- (double)start
.tv_sec
+
129 ((double)now
.tv_usec
- (double)start
.tv_usec
)/1000000.0;
132 void timer_clear(void *timer
)
134 free((time_t *)timer
);
141 #include <sys/types.h>
142 #include <sys/stat.h>
148 #define PATH_SEPS "/\\"
149 #define mkdir(x,y) _mkdir((x))
151 /* MSVC does this, borland doesn't? */
158 #define PATH_SEPS "/"
162 int create_directories(char *fn
)
166 char *segment
= malloc(strlen(fn
)+1);
170 if(strlen(fn
) >= 3 && isalpha(fn
[0]) && fn
[1]==':')
174 while((end
= strpbrk(start
+1, PATH_SEPS
)) != NULL
)
176 memcpy(segment
, fn
, end
-fn
);
179 if(stat(segment
,&statbuf
)) {
180 if(errno
== ENOENT
) {
181 if(mkdir(segment
, 0777)) {
182 fprintf(stderr
, _("Couldn't create directory \"%s\": %s\n"),
183 segment
, strerror(errno
));
189 fprintf(stderr
, _("Error checking for existence of directory %s: %s\n"),
190 segment
, strerror(errno
));
195 #if defined(_WIN32) && !defined(__BORLANDC__)
196 else if(!(_S_IFDIR
& statbuf
.st_mode
)) {
197 #elif defined(__BORLANDC__)
198 else if(!(S_IFDIR
& statbuf
.st_mode
)) {
200 else if(!S_ISDIR(statbuf
.st_mode
)) {
202 fprintf(stderr
, _("Error: path segment \"%s\" is not a directory\n"),