summaryrefslogtreecommitdiff
path: root/Build/source/texk/kpathsea/mingw32.c
diff options
context:
space:
mode:
authorDenis Bitouzé <dbitouze@wanadoo.fr>2021-02-25 18:23:07 +0000
committerDenis Bitouzé <dbitouze@wanadoo.fr>2021-02-25 18:23:07 +0000
commitc6101f91d071883b48b1b4b51e5eba0f36d9a78d (patch)
tree1bf7f5a881d7a4f5c5bf59d0b2821943dd822372 /Build/source/texk/kpathsea/mingw32.c
parent07ee7222e389b0777456b427a55c22d0e6ffd267 (diff)
French translation for tlmgr updated
git-svn-id: svn://tug.org/texlive/trunk@57912 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/kpathsea/mingw32.c')
-rw-r--r--Build/source/texk/kpathsea/mingw32.c458
1 files changed, 0 insertions, 458 deletions
diff --git a/Build/source/texk/kpathsea/mingw32.c b/Build/source/texk/kpathsea/mingw32.c
deleted file mode 100644
index a795a3a27a2..00000000000
--- a/Build/source/texk/kpathsea/mingw32.c
+++ /dev/null
@@ -1,458 +0,0 @@
-/* mingw32.c: bits and pieces for mingw32
-
- Copyright 2009-2017 Taco Hoekwater <taco@luatex.org>.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/* Original sources lifted from the distribution of XEmacs for Windows NT,
- Copyright 1994-1996 Free Software Foundation, later adapted to
- fpTeX 0.4 (2000) by Fabrice Popineau <Fabrice.Popineau@supelec.fr>,
- then simplified and re-adapted to TeXLive (2009) by Taco Hoekwater
- <taco@luatex.org>.
-*/
-
-#ifdef __MINGW32__
-
-#include <kpathsea/config.h>
-#include <kpathsea/c-pathch.h>
-#include <kpathsea/c-proto.h>
-#include <kpathsea/mingw32.h>
-#include <kpathsea/lib.h>
-#include <kpathsea/concatn.h>
-#include <kpathsea/variable.h>
-#include <kpathsea/c-stat.h>
-#include <shlobj.h>
-#include <errno.h>
-
-/* Emulate getpwuid, getpwnam and others. */
-
-typedef HWND (WINAPI *pGetDesktopWindow)(void);
-
-typedef HRESULT (WINAPI * pSHGetSpecialFolderPathA)(HWND, LPSTR, int, BOOL);
-
-extern int __cdecl _set_osfhnd (int fd, long h);
-extern int __cdecl _free_osfhnd (int fd);
-
-static char *get_home_directory (void);
-static int _parse_root (char * name, char ** pPath);
-
-double
-win32_floor (double x)
-{
- return floor (x);
-}
-
-void
-init_user_info (void)
-{
- /* Ensure HOME and SHELL are defined. */
- char *home = get_home_directory();
- if (home) {
- putenv(concat("HOME=", home));
- }
- else {
- putenv ("HOME=c:/");
- }
- if (getenv ("SHELL") == NULL)
- putenv ((GetVersion () & 0x80000000) ? "SHELL=command" : "SHELL=cmd");
-
- {
- /* Win2K problem : we need a specific TEMP directory with
- full access rights so that any user building a format file
- or a font file will build it with full access rights. The installer
- takes care of defining TEXMFTEMP=$SELFAUTOPARENT/tmp in the environment.
- If it is defined, then use it as the TEMP and TMP variables.
- */
- char *p;
- if ((p = getenv("TEXMFTEMP")) != NULL) {
- putenv(concat("TEMP=", p));
- putenv(concat("TMP=", p));
- }
- }
-}
-
-/* Returns the home directory, in external format */
-static char *
-get_home_directory (void)
-{
- char *found_home_directory = NULL;
-
- if ((found_home_directory = getenv("HOME")) != NULL) {
- char q[MAXPATHLEN];
- /* In case it is %HOMEDRIVE%%HOMEPATH% */
- if (ExpandEnvironmentStrings(found_home_directory, q, sizeof(q)) == 0) {
- /* Error */
- found_home_directory = NULL;
- }
- else {
- found_home_directory = xstrdup(q);
- goto done;
- }
- }
-
- {
- char *homedrive, *homepath;
- if ((homedrive = getenv("HOMEDRIVE")) != NULL &&
- (homepath = getenv("HOMEPATH")) != NULL) {
- found_home_directory = concat(homedrive, homepath);
- goto done;
- }
- }
-
- /* This method is the prefered one because even if it requires a more recent shell32.dll,
- it does not need to call SHMalloc()->Free() */
- {
- /* This will probably give the wrong value */
- char q [MAXPATHLEN];
- HINSTANCE h;
- pSHGetSpecialFolderPathA p1;
- pGetDesktopWindow p2;
- HWND hwnd = NULL;
-
- if ((h = LoadLibrary("user32.dll"))) {
- if ((p2 = (pGetDesktopWindow)GetProcAddress(h, "GetDesktopWindow")))
- hwnd = (*p2)();
- FreeLibrary(h);
- }
-
- if (hwnd && (h = LoadLibrary("shell32.dll"))) {
- if ((p1 = (pSHGetSpecialFolderPathA)GetProcAddress(h, "SHGetSpecialFolderPathA")))
- if ((*p1)(hwnd, q, CSIDL_PERSONAL, TRUE)) {
- found_home_directory = xstrdup(q);
- }
- FreeLibrary(h);
- }
- if (found_home_directory) goto done;
- }
-
- if (1) {
- fprintf(stderr, "kpathsea has been unable to determine a good value for the user's $HOME\n"
- " directory, and will be using the value:\n"
- " %s\n"
- " This is probably incorrect.\n",
- found_home_directory
- );
- }
- done:
- return found_home_directory;
-}
-
-
-/* Consider cached volume information to be stale if older than 10s,
- at least for non-local drives. Info for fixed drives is never stale. */
-#define DRIVE_INDEX( c ) ( (c) <= 'Z' ? (c) - 'A' : (c) - 'a' )
-#define VOLINFO_STILL_VALID( root_dir, info ) \
- ( ( isalpha (root_dir[0]) ) \
- || GetTickCount () - info->timestamp < 10000 )
-
-
-/* Normalize filename by converting all path separators to
- the specified separator. Also conditionally convert upper
- case path name components to lower case.
- Returns the index of the first meaningful char in the path
- past any drive specifier of unc name specifier.
- Remove any multiple path separators after a leading
- drive specifier or double path separator.
-*/
-
-static int
-normalize_filename (char *fp, char path_sep)
-{
- char *p;
- int ret, i;
-
- /* Always lower-case drive letters a-z, even if the filesystem
- preserves case in filenames.
- This is so filenames can be compared by string comparison
- functions that are case-sensitive. Even case-preserving filesystems
- do not distinguish case in drive letters. */
- if (fp[1] == ':' && *fp >= 'A' && *fp <= 'Z') {
- *fp += 'a' - 'A';
- }
-
- /* Remove unneeded double slashes */
- ret = (IS_UNC_NAME(fp) ? 2 :
- NAME_BEGINS_WITH_DEVICE(fp) ?
- (IS_DIR_SEP(*(fp+2)) ? 3 : 2) : IS_DIR_SEP(*fp) ? 1 : 0);
- for (i = ret, p = fp+i;
- IS_DIR_SEP(*p);
- i++, p++);
- if (i > ret) {
- int len = strlen(fp+i);
- /* remove unneeded slashes, for the sake of win95 */
-#if 0
- fprintf(stderr, "moving %s to %s\n", fp+ret, fp+i);
-#endif
- memmove (fp+ret, fp+i, len+1);
- }
-
- /* conditionnally rewrite to same path_sep, slash preferably */
- if (path_sep) {
- for (p = fp; *p; p++)
- if (IS_DIR_SEP(*p))
- *p = path_sep;
- }
-
-#if 0
- fprintf(stderr, "normalize_filename returned (%d) %s\n", ret, fp);
-#endif
-
- return ret;
-}
-
-
-/* Destructively turn backslashes into slashes. */
-#if 0 /* unused */
-static void
-dostounix_filename (char *p)
-{
- normalize_filename (p, '/');
-}
-#endif
-
-/* Destructively turn slashes into backslashes. */
-static void
-unixtodos_filename (char *p)
-{
- normalize_filename (p, '\\');
-}
-
-/* Remove all CR's that are followed by a LF.
- (From msdos.c...probably should figure out a way to share it,
- although this code isn't going to ever change.) */
-#if 0 /* unused */
-static int
-crlf_to_lf (int n, unsigned char *buf, unsigned *lf_count)
-{
- unsigned char *np = buf;
- unsigned char *startp = buf;
- unsigned char *endp = buf + n;
-
- if (n == 0)
- return n;
- while (buf < endp - 1)
- {
- if (*buf == 0x0a)
- (*lf_count)++;
- if (*buf == 0x0d)
- {
- if (*(++buf) != 0x0a)
- *np++ = 0x0d;
- }
- else
- *np++ = *buf++;
- }
- if (buf < endp)
- {
- if (*buf == 0x0a)
- (*lf_count)++;
- *np++ = *buf++;
- }
- return np - startp;
-}
-#endif
-
-/* Parse the root part of file name, if present. Return length and
- optionally store pointer to char after root. */
-static int
-_parse_root (char * name, char ** pPath)
-{
- char * start = name;
-
- if (name == NULL)
- return 0;
-
- /* find the root name of the volume if given */
- if (isalpha (name[0]) && name[1] == ':')
- {
- /* skip past drive specifier */
- name += 2;
- if (IS_DIR_SEP (name[0]))
- name++;
- }
- else if (IS_DIR_SEP (name[0]) && IS_DIR_SEP (name[1]))
- {
- int slashes = 2;
- name += 2;
- do
- {
- if (IS_DIR_SEP (*name) && --slashes == 0)
- break;
- name++;
- }
- while ( *name );
- if (IS_DIR_SEP (name[0]))
- name++;
- }
-
- if (pPath)
- *pPath = name;
-
- return name - start;
-}
-
-/* Get long base name for name; name is assumed to be absolute. */
-static int
-get_long_basename (char * name, char * buf, int size)
-{
- WIN32_FIND_DATA find_data;
- HANDLE dir_handle;
- int len = 0;
-#ifdef PIGSFLY
- char *p;
-
- /* If the last component of NAME has a wildcard character,
- return it as the basename. */
- p = name + strlen (name);
- while (*p != '\\' && *p != ':' && p > name) p--;
- if (p > name) p++;
- if (strchr (p, '*') || strchr (p, '?'))
- {
- if ((len = strlen (p)) < size)
- memcpy (buf, p, len + 1);
- else
- len = 0;
- return len;
- }
-#endif
-
- dir_handle = FindFirstFile (name, &find_data);
- if (dir_handle != INVALID_HANDLE_VALUE)
- {
- if ((len = strlen (find_data.cFileName)) < size)
- memcpy (buf, find_data.cFileName, len + 1);
- else
- len = 0;
- FindClose (dir_handle);
- }
- return len;
-}
-
-/* Get long name for file, if possible (assumed to be absolute). */
-BOOL
-win32_get_long_filename (char * name, char * buf, int size)
-{
- char * o = buf;
- char * p;
- char * q;
- char full[ MAX_PATH ];
- int len;
-
- len = strlen (name);
- if (len >= MAX_PATH)
- return FALSE;
-
- /* Use local copy for destructive modification. */
- memcpy (full, name, len+1);
- unixtodos_filename (full);
-
- /* Copy root part verbatim. */
- len = _parse_root (full, &p);
- memcpy (o, full, len);
- o += len;
- size -= len;
-
- do
- {
- q = p;
- p = strchr (q, '\\');
- if (p) *p = '\0';
- len = get_long_basename (full, o, size);
- if (len > 0)
- {
- o += len;
- size -= len;
- if (p != NULL)
- {
- *p++ = '\\';
- if (size < 2)
- return FALSE;
- *o++ = '\\';
- size--;
- *o = '\0';
- }
- }
- else
- return FALSE;
- }
- while (p != NULL && *p);
-
- return TRUE;
-}
-
-/* special TeXLive Ghostscript */
-
-static int is_dir (char *buff)
-{
- struct stat stats;
-
- return stat (buff, &stats) == 0 && S_ISDIR (stats.st_mode);
-}
-
-/*
- TeXlive uses its own gs in
- $SELFAUTOPARENT/tlpkg/tlgs
-*/
-void texlive_gs_init(void)
-{
- char *nptr, *path;
- char tlgsbindir[512];
- char tlgslibdir[512];
- char resourcedir[512];
- nptr = kpse_var_value("TEXLIVE_WINDOWS_EXTERNAL_GS");
- if (nptr == NULL || *nptr == '0' || *nptr == 'n' || *nptr == 'f') {
- if (nptr)
- free (nptr);
- nptr = kpse_var_value("SELFAUTOPARENT");
- if (nptr) {
- strcpy(tlgsbindir, nptr);
- strcat(tlgsbindir,"/tlpkg/tlgs");
- strcpy(resourcedir, tlgsbindir);
- strcat(resourcedir, "/Resource");
- if(is_dir(tlgsbindir)) {
- strcpy(tlgslibdir, tlgsbindir);
- strcat(tlgslibdir, "/lib;");
- if(is_dir(resourcedir)) {
- strcat(tlgslibdir, tlgsbindir);
- strcat(tlgslibdir, "/fonts;");
- strcat(tlgslibdir, tlgsbindir);
- strcat(tlgslibdir, "/Resource/Init;");
- strcat(tlgslibdir, tlgsbindir);
- strcat(tlgslibdir, "/Resource;");
- strcat(tlgslibdir, tlgsbindir);
- strcat(tlgslibdir, "/kanji");
- } else {
- strcat(tlgslibdir, tlgsbindir);
- strcat(tlgslibdir, "/fonts");
- }
- strcat(tlgsbindir, "/bin;");
- free(nptr);
- for(nptr = tlgsbindir; *nptr; nptr++) {
- if(*nptr == '/') *nptr = '\\';
- }
- nptr = getenv("PATH");
- path = (char *)malloc(strlen(nptr) + strlen(tlgsbindir) + 6);
- strcpy(path, tlgsbindir);
- strcat(path, nptr);
- xputenv("PATH", path);
- xputenv("GS_LIB", tlgslibdir);
- }
- }
- } else {
- free (nptr);
- }
-}
-
-#endif /* __MINGW32__ */