| /********************************************************************** |
| * 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 |
| } |