blob: a8a08d25ce17148d68e4f7475e09b951446aa568 [file] [log] [blame]
/**********************************************************************
* File: basedir.c (Formerly getpath.c)
* Description: Find the directory location of the current executable using PATH.
* Author: Ray Smith
* Created: Mon Jul 09 09:06:39 BST 1990
*
* (C) Copyright 1990, Hewlett-Packard Ltd.
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
** http://www.apache.org/licenses/LICENSE-2.0
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*
**********************************************************************/
#include "mfcpch.h" //precompiled headers
#include "strngs.h"
#ifdef __UNIX__
#include <unistd.h>
#include <fcntl.h>
#endif
#include <stdlib.h>
#include "basedir.h"
#include "varable.h"
#include "notdll.h" //must be last include
#ifdef __MSW32__
STRING_VAR(tessedit_module_name, "tessdll.dll",
"Module colocated with tessdata dir");
#endif
/**********************************************************************
* getpath
*
* Find the directory of the given executable using the usual path rules.
* This enables data to be located relative to the code.
**********************************************************************/
DLLSYM inT8 getpath( //get dir name of code
const char *code, //executable to locate
STRING &path //output path name
) {
char directory[MAX_PATH]; //main directory
#ifdef __UNIX__
inT16 dirind; //index in directory
register char *pathlist; //$PATH
int fd; //file descriptor
strcpy(directory, code); //get demo directory
dirind = strlen (directory);
while (dirind > 0 && directory[dirind - 1] != '/')
dirind--; //look back for dirname
directory[dirind] = '\0'; //end at directory
if (dirind != 0) {
path = directory; //had it in arg
return 0;
}
pathlist = getenv ("PATH"); //find search path
while (pathlist != NULL && *pathlist) {
for (dirind = 0; *pathlist != '\0' && *pathlist != ':';)
//copy a directory
directory[dirind++] = *pathlist++;
if (*pathlist == ':')
pathlist++;
if (dirind == 0)
continue;
if (directory[dirind - 1] != '/');
directory[dirind++] = '/'; //add ending slash
directory[dirind++] = '\0';
path = directory; //try this path
strcat(directory, code);
fd = open (directory, 0);
if (fd >= 0) {
close(fd); //found it
return 0;
}
}
strcpy (directory, "./");
path = directory; //in current?
strcat(directory, code);
fd = open (directory, 0);
if (fd >= 0) {
close(fd);
return 0; //in current after all
}
return -1;
#endif
#ifdef __MSW32__
char *path_end; //end of dir
if (code == NULL) {
// Attempt to get the path of the most relevant module. If the dll
// is being used, this will be the dll. Otherwise GetModuleHandle will
// return NULL and default to the path of the executable.
if (GetModuleFileName(GetModuleHandle(tessedit_module_name.string()),
directory, MAX_PATH - 1) == 0) {
return -1;
}
} else {
strncpy(directory, code, MAX_PATH - 1);
}
while ((path_end = strchr (directory, '\\')) != NULL)
*path_end = '/';
path_end = strrchr (directory, '/');
if (path_end != NULL)
path_end[1] = '\0';
else
strcpy (directory, "./");
path = directory;
return 0;
#endif
}