Break down dirpath.c into fs_*.c by OS
I much prefer this to using ifdefs. Requires a little help from the build system but I find it worth it.
This commit is contained in:
parent
99feb308bd
commit
1d96278313
|
@ -27,7 +27,7 @@
|
||||||
#include "htable.h"
|
#include "htable.h"
|
||||||
#include "htableh_inc.h"
|
#include "htableh_inc.h"
|
||||||
#include "bitvector.h"
|
#include "bitvector.h"
|
||||||
#include "dirpath.h"
|
#include "fs.h"
|
||||||
#include "random.h"
|
#include "random.h"
|
||||||
#include "llt.h"
|
#include "llt.h"
|
||||||
|
|
||||||
|
|
19
c/dirpath.h
19
c/dirpath.h
|
@ -1,19 +0,0 @@
|
||||||
#ifdef WIN32
|
|
||||||
#define PATHSEP '\\'
|
|
||||||
#define PATHSEPSTRING "\\"
|
|
||||||
#define PATHLISTSEP ';'
|
|
||||||
#define PATHLISTSEPSTRING ";"
|
|
||||||
#define ISPATHSEP(c) ((c) == '/' || (c) == '\\')
|
|
||||||
#define MAXPATHLEN 1024
|
|
||||||
#else
|
|
||||||
#define PATHSEP '/'
|
|
||||||
#define PATHSEPSTRING "/"
|
|
||||||
#define PATHLISTSEP ':'
|
|
||||||
#define PATHLISTSEPSTRING ":"
|
|
||||||
#define ISPATHSEP(c) ((c) == '/')
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void get_cwd(char *buf, size_t size);
|
|
||||||
int set_cwd(char *buf);
|
|
||||||
char *get_exename(char *buf, size_t size);
|
|
||||||
void path_to_dirname(char *path);
|
|
|
@ -16,7 +16,7 @@
|
||||||
#include "htable.h"
|
#include "htable.h"
|
||||||
#include "htableh_inc.h"
|
#include "htableh_inc.h"
|
||||||
#include "bitvector.h"
|
#include "bitvector.h"
|
||||||
#include "dirpath.h"
|
#include "fs.h"
|
||||||
#include "random.h"
|
#include "random.h"
|
||||||
#include "llt.h"
|
#include "llt.h"
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,7 @@
|
||||||
#include "htable.h"
|
#include "htable.h"
|
||||||
#include "htableh_inc.h"
|
#include "htableh_inc.h"
|
||||||
#include "bitvector.h"
|
#include "bitvector.h"
|
||||||
#include "dirpath.h"
|
#include "fs.h"
|
||||||
#include "random.h"
|
#include "random.h"
|
||||||
#include "llt.h"
|
#include "llt.h"
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include "htable.h"
|
#include "htable.h"
|
||||||
#include "htableh_inc.h"
|
#include "htableh_inc.h"
|
||||||
#include "bitvector.h"
|
#include "bitvector.h"
|
||||||
#include "dirpath.h"
|
#include "fs.h"
|
||||||
#include "random.h"
|
#include "random.h"
|
||||||
#include "llt.h"
|
#include "llt.h"
|
||||||
|
|
||||||
|
@ -50,8 +50,7 @@ int main(int argc, char *argv[])
|
||||||
if (exedir == NULL) {
|
if (exedir == NULL) {
|
||||||
snprintf(fname_buf, sizeof(fname_buf), "%s", bootfile);
|
snprintf(fname_buf, sizeof(fname_buf), "%s", bootfile);
|
||||||
} else {
|
} else {
|
||||||
snprintf(fname_buf, sizeof(fname_buf), "%s%s%s", exedir,
|
snprintf(fname_buf, sizeof(fname_buf), "%s/%s", exedir, bootfile);
|
||||||
PATHSEPSTRING, bootfile);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
value_t args[2];
|
value_t args[2];
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
void path_to_dirname(char *path);
|
||||||
|
void get_cwd(char *buf, size_t size);
|
||||||
|
int set_cwd(char *buf);
|
||||||
|
char *get_exename(char *buf, size_t size);
|
|
@ -0,0 +1,11 @@
|
||||||
|
#include <mach-o/dyld.h>
|
||||||
|
|
||||||
|
#include "fs.h"
|
||||||
|
|
||||||
|
char *get_exename(char *buf, size_t size)
|
||||||
|
{
|
||||||
|
uint32_t bufsize = (uint32_t)size;
|
||||||
|
if (_NSGetExecutablePath(buf, &bufsize))
|
||||||
|
return NULL;
|
||||||
|
return buf;
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include <sys/sysctl.h>
|
||||||
|
|
||||||
|
#include "fs.h"
|
||||||
|
|
||||||
|
char *get_exename(char *buf, size_t size)
|
||||||
|
{
|
||||||
|
int mib[4];
|
||||||
|
mib[0] = CTL_KERN;
|
||||||
|
mib[1] = KERN_PROC;
|
||||||
|
mib[2] = KERN_PROC_PATHNAME;
|
||||||
|
mib[3] = -1;
|
||||||
|
sysctl(mib, 4, buf, &size, NULL, 0);
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "fs.h"
|
||||||
|
|
||||||
|
char *get_exename(char *buf, size_t size)
|
||||||
|
{
|
||||||
|
char linkname[64]; /* /proc/<pid>/exe */
|
||||||
|
pid_t pid;
|
||||||
|
ssize_t ret;
|
||||||
|
|
||||||
|
/* Get our PID and build the name of the link in /proc */
|
||||||
|
pid = getpid();
|
||||||
|
|
||||||
|
if (snprintf(linkname, sizeof(linkname), "/proc/%i/exe", pid) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Now read the symbolic link */
|
||||||
|
ret = readlink(linkname, buf, size);
|
||||||
|
|
||||||
|
/* In case of an error, leave the handling up to the caller */
|
||||||
|
if (ret == -1)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Report insufficient buffer size */
|
||||||
|
if ((size_t)ret >= size)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Ensure proper NUL termination */
|
||||||
|
buf[ret] = 0;
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
|
@ -1,98 +1,13 @@
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "dtypes.h"
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
#include <malloc.h>
|
|
||||||
#include <sys/timeb.h>
|
|
||||||
#include <windows.h>
|
|
||||||
#undef NO_ERROR
|
|
||||||
#undef MOD_SHIFT
|
|
||||||
#undef TRUE
|
|
||||||
#undef FALSE
|
|
||||||
#undef VOID
|
|
||||||
#else
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <sys/poll.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "dirpath.h"
|
|
||||||
|
|
||||||
void get_cwd(char *buf, size_t size)
|
|
||||||
{
|
|
||||||
#ifndef WIN32
|
|
||||||
getcwd(buf, size);
|
|
||||||
#else
|
|
||||||
GetCurrentDirectory(size, buf);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
int set_cwd(char *buf)
|
|
||||||
{
|
|
||||||
#ifndef WIN32
|
|
||||||
if (chdir(buf) == -1)
|
|
||||||
return 1;
|
|
||||||
#else
|
|
||||||
if (SetCurrentDirectory(buf) == 0)
|
|
||||||
return 1;
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// destructively convert path to directory part
|
|
||||||
void path_to_dirname(char *path)
|
|
||||||
{
|
|
||||||
char *sep = strrchr(path, PATHSEP);
|
|
||||||
if (sep != NULL) {
|
|
||||||
*sep = '\0';
|
|
||||||
} else {
|
|
||||||
path[0] = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef LINUX
|
|
||||||
char *get_exename(char *buf, size_t size)
|
|
||||||
{
|
|
||||||
char linkname[64]; /* /proc/<pid>/exe */
|
|
||||||
pid_t pid;
|
|
||||||
ssize_t ret;
|
|
||||||
|
|
||||||
/* Get our PID and build the name of the link in /proc */
|
|
||||||
pid = getpid();
|
|
||||||
|
|
||||||
if (snprintf(linkname, sizeof(linkname), "/proc/%i/exe", pid) < 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* Now read the symbolic link */
|
|
||||||
ret = readlink(linkname, buf, size);
|
|
||||||
|
|
||||||
/* In case of an error, leave the handling up to the caller */
|
|
||||||
if (ret == -1)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* Report insufficient buffer size */
|
|
||||||
if ((size_t)ret >= size)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* Ensure proper NUL termination */
|
|
||||||
buf[ret] = 0;
|
|
||||||
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
#elif defined(OPENBSD)
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
|
||||||
|
#include <sys/stat.h>
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "fs.h"
|
||||||
|
|
||||||
char *get_exename(char *buf, size_t size)
|
char *get_exename(char *buf, size_t size)
|
||||||
{
|
{
|
||||||
int mib[4];
|
int mib[4];
|
||||||
|
@ -197,36 +112,3 @@ char *get_exename(char *buf, size_t size)
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
#elif defined(FREEBSD)
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/sysctl.h>
|
|
||||||
|
|
||||||
char *get_exename(char *buf, size_t size)
|
|
||||||
{
|
|
||||||
int mib[4];
|
|
||||||
mib[0] = CTL_KERN;
|
|
||||||
mib[1] = KERN_PROC;
|
|
||||||
mib[2] = KERN_PROC_PATHNAME;
|
|
||||||
mib[3] = -1;
|
|
||||||
sysctl(mib, 4, buf, &size, NULL, 0);
|
|
||||||
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
#elif defined(WIN32)
|
|
||||||
char *get_exename(char *buf, size_t size)
|
|
||||||
{
|
|
||||||
if (GetModuleFileName(NULL, buf, size) == 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
#elif defined(MACOSX)
|
|
||||||
#include <mach-o/dyld.h>
|
|
||||||
char *get_exename(char *buf, size_t size)
|
|
||||||
{
|
|
||||||
uint32_t bufsize = (uint32_t)size;
|
|
||||||
if (_NSGetExecutablePath(buf, &bufsize))
|
|
||||||
return NULL;
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "fs.h"
|
||||||
|
|
||||||
|
void path_to_dirname(char *path)
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
if (!(p = strrchr(path, '/'))) {
|
||||||
|
p = path;
|
||||||
|
}
|
||||||
|
*p = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
void get_cwd(char *buf, size_t size) { getcwd(buf, size); }
|
||||||
|
|
||||||
|
int set_cwd(char *buf)
|
||||||
|
{
|
||||||
|
if (chdir(buf) == -1)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#include "fs.h"
|
||||||
|
|
||||||
|
void path_to_dirname(char *path)
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
p = strchr(path, 0);
|
||||||
|
while (p > path) {
|
||||||
|
p--;
|
||||||
|
if ((*p == '/') || (*p == '\\')) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*p = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
void get_cwd(char *buf, size_t size) { GetCurrentDirectory(size, buf); }
|
||||||
|
|
||||||
|
int set_cwd(char *buf)
|
||||||
|
{
|
||||||
|
if (SetCurrentDirectory(buf) == 0)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *get_exename(char *buf, size_t size)
|
||||||
|
{
|
||||||
|
if (GetModuleFileName(NULL, buf, size) == 0)
|
||||||
|
return NULL;
|
||||||
|
return buf;
|
||||||
|
}
|
|
@ -17,7 +17,7 @@
|
||||||
#include "htable.h"
|
#include "htable.h"
|
||||||
#include "htableh_inc.h"
|
#include "htableh_inc.h"
|
||||||
#include "bitvector.h"
|
#include "bitvector.h"
|
||||||
#include "dirpath.h"
|
#include "fs.h"
|
||||||
#include "random.h"
|
#include "random.h"
|
||||||
#include "llt.h"
|
#include "llt.h"
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#include "htable.h"
|
#include "htable.h"
|
||||||
#include "htableh_inc.h"
|
#include "htableh_inc.h"
|
||||||
#include "bitvector.h"
|
#include "bitvector.h"
|
||||||
#include "dirpath.h"
|
#include "fs.h"
|
||||||
#include "random.h"
|
#include "random.h"
|
||||||
#include "llt.h"
|
#include "llt.h"
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
#include "htable.h"
|
#include "htable.h"
|
||||||
#include "htableh_inc.h"
|
#include "htableh_inc.h"
|
||||||
#include "bitvector.h"
|
#include "bitvector.h"
|
||||||
#include "dirpath.h"
|
#include "fs.h"
|
||||||
#include "random.h"
|
#include "random.h"
|
||||||
#include "llt.h"
|
#include "llt.h"
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,11 @@
|
||||||
set -eu
|
set -eu
|
||||||
CC="${CC:-clang}"
|
CC="${CC:-clang}"
|
||||||
CFLAGS="-Wall -Wextra -Wno-strict-aliasing -std=gnu99"
|
CFLAGS="-Wall -Wextra -Wno-strict-aliasing -std=gnu99"
|
||||||
CFLAGS="$CFLAGS -O2" # -falign-functions
|
CFLAGS="$CFLAGS -O2" # -falign-functions
|
||||||
CFLAGS="$CFLAGS -I ../c -D NDEBUG -D USE_COMPUTED_GOTO"
|
CFLAGS="$CFLAGS -I ../c -D NDEBUG -D USE_COMPUTED_GOTO"
|
||||||
LFLAGS="-lm"
|
LFLAGS="-lm"
|
||||||
builddir="build-$(uname | tr A-Z- a-z_)-$(uname -m | tr A-Z- a-z_)"
|
os="$(uname | tr A-Z- a-z_)"
|
||||||
|
builddir="build-$os-$(uname -m | tr A-Z- a-z_)"
|
||||||
cd "$(dirname "$0")"/..
|
cd "$(dirname "$0")"/..
|
||||||
echo "Entering directory '$PWD'"
|
echo "Entering directory '$PWD'"
|
||||||
set -x
|
set -x
|
||||||
|
@ -15,14 +16,16 @@ find "$builddir" -mindepth 1 -delete
|
||||||
cd "$builddir"
|
cd "$builddir"
|
||||||
echo "Entering directory '$PWD'"
|
echo "Entering directory '$PWD'"
|
||||||
set -x
|
set -x
|
||||||
|
ln -s ../scheme-boot/flisp.boot flisp.boot
|
||||||
$CC $CFLAGS -c ../c/bitvector-ops.c
|
$CC $CFLAGS -c ../c/bitvector-ops.c
|
||||||
$CC $CFLAGS -c ../c/bitvector.c
|
$CC $CFLAGS -c ../c/bitvector.c
|
||||||
$CC $CFLAGS -c ../c/builtins.c
|
$CC $CFLAGS -c ../c/builtins.c
|
||||||
$CC $CFLAGS -c ../c/dirpath.c
|
|
||||||
$CC $CFLAGS -c ../c/dump.c
|
$CC $CFLAGS -c ../c/dump.c
|
||||||
$CC $CFLAGS -c ../c/equalhash.c
|
$CC $CFLAGS -c ../c/equalhash.c
|
||||||
$CC $CFLAGS -c ../c/flisp.c
|
$CC $CFLAGS -c ../c/flisp.c
|
||||||
$CC $CFLAGS -c ../c/flmain.c
|
$CC $CFLAGS -c ../c/flmain.c
|
||||||
|
$CC $CFLAGS -c ../c/fs_"$os".c
|
||||||
|
$CC $CFLAGS -c ../c/fs_unix.c
|
||||||
$CC $CFLAGS -c ../c/hashing.c
|
$CC $CFLAGS -c ../c/hashing.c
|
||||||
$CC $CFLAGS -c ../c/htable.c
|
$CC $CFLAGS -c ../c/htable.c
|
||||||
$CC $CFLAGS -c ../c/int2str.c
|
$CC $CFLAGS -c ../c/int2str.c
|
||||||
|
@ -37,11 +40,11 @@ $CC $CFLAGS -c ../c/table.c
|
||||||
$CC $CFLAGS -c ../c/timefuncs.c
|
$CC $CFLAGS -c ../c/timefuncs.c
|
||||||
$CC $CFLAGS -c ../c/utf8.c
|
$CC $CFLAGS -c ../c/utf8.c
|
||||||
$CC $LFLAGS -o flisp -lm \
|
$CC $LFLAGS -o flisp -lm \
|
||||||
bitvector-ops.o bitvector.o builtins.o dirpath.o dump.o \
|
bitvector-ops.o bitvector.o builtins.o dump.o \
|
||||||
equalhash.o flisp.o flmain.o hashing.o htable.o int2str.o \
|
equalhash.o flisp.o flmain.o fs_"$os".o fs_unix.o \
|
||||||
ios.o iostream.o lltinit.o ptrhash.o random.o socket.o \
|
hashing.o htable.o int2str.o \
|
||||||
string.o table.o timefuncs.o utf8.o
|
ios.o iostream.o lltinit.o ptrhash.o random.o socket.o \
|
||||||
ln -s ../scheme-boot/flisp.boot flisp.boot
|
string.o table.o timefuncs.o utf8.o
|
||||||
{ set +x; } 2>/dev/null
|
{ set +x; } 2>/dev/null
|
||||||
cd ../scheme-core
|
cd ../scheme-core
|
||||||
echo "Entering directory '$PWD'"
|
echo "Entering directory '$PWD'"
|
||||||
|
|
Loading…
Reference in New Issue