gnuwin32.c
来自「编译工具」· C语言 代码 · 共 423 行
C
423 行
#include <windows.h>#include "gnuwin32.h"//#define DEBUG_MOUNTS#define MAX_MOUNTS 256#ifdef __MINGW32__#include <stdio.h>void GetMinGW32Mounts(void);#elseint GetCygwinMounts(void);void GetGnuwin32Mounts(void);#endifvoid GetOpenNTMounts(void);void SortMounts();char *dos[MAX_MOUNTS];char *unix[MAX_MOUNTS];int index[MAX_MOUNTS];int nmounts;char* drvprefix;char *TranslateFileNameU2D(char *in, int offset){ int i; char *out = NULL; for (i = 0; i < nmounts; i++) { char *upath = unix[index[i]]; char *dpath = dos[index[i]]; if (strncmp(upath, &in[offset], strlen(upath)) == 0) { out = malloc(strlen(in) - strlen(upath) + strlen(dpath) + 1); strncpy(out, in, offset); /* doesn't NUL-terminate! */ strcpy(out + offset, dpath); strcat(out, &in[offset + strlen(upath)]); break; } } if (!out) { out = malloc(strlen(in) + 1); strcpy(out, in); } for (i = offset; i < strlen(out); i++) { if (out[i] == '/') { out[i] = '\\'; } } return out;}char *TranslateFileNameD2U(char *in, int offset){ int i; char *out = NULL; /* make a copy, make sure that all \ are translated back to / */ char *tmp = malloc(strlen(in)+1); strcpy(tmp,in); for (i = 0; i < strlen(tmp); i++) { if (tmp[i] == '\\') tmp[i] = '/'; } in = tmp; for (i = 0; i < nmounts; i++) { char *upath = unix[index[i]]; char *dpath = dos[index[i]]; if (strncmp(dpath, &in[offset], strlen(dpath)) == 0) { out = malloc(strlen(in) - strlen(dpath) + strlen(upath) + 1); strncpy(out, in, offset); /* doesn't NUL-terminate! */ strcpy(out + offset, upath); strcat(out, &in[offset + strlen(dpath)]); break; } } if (!out) { out = malloc(strlen(in) + 1); strcpy(out, in); } for (i = offset; i < strlen(out); i++) { if (out[i] == '\\') { out[i] = '/'; } } /* Any residue dos drive, i.e. [A-Za-z]:, convert to //[A-Za-z] on cygwin/opennt resp. to /[A-Za-z] on mingw */ if (strlen(out) >= 2 && out[1] == ':') { char* newout; int io = 0;#ifdef __MINGW32__ newout = malloc(strlen(out) + 1); newout[io++] = '/'; newout[io++] = out[0]; newout[io++] = '\0';#else newout = malloc(strlen(out) + strlen(drvprefix) + 2); sprintf(newout, "%s/", drvprefix); io = strlen(newout);#endif newout[io++] = out[0]; newout[io++] = '\0'; strcat(newout,out+2); out = newout; } free(tmp); return out;}void GetMounts(int gnuwin){ drvprefix = ""; if (gnuwin) {#ifdef __MINGW32__ GetMinGW32Mounts();#else if (!GetCygwinMounts()) GetGnuwin32Mounts();#endif } else { GetOpenNTMounts(); } SortMounts();}void GetOpenNTMounts(void){ char c; nmounts = 0; for (c = 'A'; c <= 'Z'; c++) { unix[nmounts] = (char *)malloc(5); sprintf(unix[nmounts], "//%c/", c); dos[nmounts] = (char *)malloc(4); sprintf(dos[nmounts], "%c:/", c); index[nmounts] = nmounts; nmounts++; } for (c = 'a'; c <= 'z'; c++) { unix[nmounts] = (char *)malloc(5); sprintf(unix[nmounts], "//%c/", c); dos[nmounts] = (char *)malloc(4); sprintf(dos[nmounts], "%c:/", c); index[nmounts] = nmounts; nmounts++; }}#ifdef __MINGW32__void GetMinGW32Mounts(void){ HKEY hkey; char *msys_path,*fstab_name; int len,c; FILE *fstab; const char *key = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\MSYS-1.0_is1"; nmounts = 0; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, 0, KEY_READ, &hkey) == ERROR_SUCCESS) { if (RegQueryValueEx(hkey,"Inno Setup: App Path",NULL,NULL,NULL,&len) != ERROR_SUCCESS) { printf("RegQueryValueEx failed - error %d\n",GetLastError()); exit(1); } msys_path = (char *)malloc(len+2); if (RegQueryValueEx(hkey,"Inno Setup: App Path",NULL,NULL,msys_path,&len) != ERROR_SUCCESS) { printf("RegQueryValueEx failed - error %d\n",GetLastError()); exit(1); } len = strlen(msys_path); if (len && msys_path[len-1] != '\\') { msys_path[len] = '\\'; ++len; msys_path[len] = '\0'; } // add default mounts. unix[nmounts] = strdup("/"); dos[nmounts] = msys_path; ++nmounts; unix[nmounts] = strdup("/usr/"); dos[nmounts] = msys_path; ++nmounts; fstab_name = (char *)malloc(len+10); strcpy(fstab_name,msys_path); strcat(fstab_name,"etc\\fstab"); // now scan /etc/fstab fstab = fopen(fstab_name,"rb"); free(fstab_name); if (fstab) { char u[1024],d[1024]; while (nmounts < MAX_MOUNTS) { c = fgetc(fstab); if (c != '#') { while (c==' ' || c == '\t') c = fgetc(fstab); if (c != '\n') { ungetc(c,fstab); if (fscanf (fstab,"%1024s %1024s",d,u) == 2) { unix[nmounts] = strdup(u); dos[nmounts] = strdup(d); ++nmounts; } else break; while (c==' ' || c == '\t') c = fgetc(fstab); } } else { while (c != EOF && c != '\n') c = fgetc(fstab); } if (c!= '\n') break; } fclose(fstab); } } // drive mounts. for (c = 'A'; c <= 'Z'; c++) { unix[nmounts] = (char *)malloc(4); sprintf(unix[nmounts], "/%c/", c); dos[nmounts] = (char *)malloc(4); sprintf(dos[nmounts], "%c:/", c); index[nmounts] = nmounts; nmounts++; } for (c = 'a'; c <= 'z'; c++) { unix[nmounts] = (char *)malloc(4); sprintf(unix[nmounts], "/%c/", c); dos[nmounts] = (char *)malloc(4); sprintf(dos[nmounts], "%c:/", c); index[nmounts] = nmounts; nmounts++; }}#elsevoid GetGnuwin32Mounts(void){ HKEY hkey; LONG rc; int len; char key[256]; for (nmounts = 0; nmounts < MAX_MOUNTS; nmounts++) { sprintf(key, "Software\\Cygnus Solutions\\CYGWIN.DLL setup\\b15.0\\mounts\\%02X" ,nmounts); if (RegOpenKeyEx(HKEY_CURRENT_USER, key, 0, KEY_READ, &hkey) != ERROR_SUCCESS) { if (nmounts == 0) { printf("Couldn't find registry key '%s' - RegOpenKey error %d\n", key, GetLastError()); exit(1); } break; } if (RegQueryValueEx(hkey,"unix",NULL,NULL,NULL,&len) != ERROR_SUCCESS) { printf("RegQueryValueEx failed - error %d\n",GetLastError()); exit(1); } unix[nmounts] = (char *)malloc(len+1); RegQueryValueEx(hkey, "unix", NULL, NULL, unix[nmounts], &len); if (RegQueryValueEx(hkey,"native",NULL,NULL,NULL,&len) != ERROR_SUCCESS) { printf("RegQueryValueEx failed - error %d\n",GetLastError()); exit(1); } if (strcmp(unix[nmounts], "/") == 0) { dos[nmounts] = (char *)malloc(len+2); RegQueryValueEx(hkey, "native", NULL, NULL, dos[nmounts], &len); dos[nmounts][len-1] = '\\'; dos[nmounts][len] = 0; } else { dos[nmounts] = (char *)malloc(len+1); RegQueryValueEx(hkey, "native", NULL, NULL, dos[nmounts], &len); } }}intGetCygwinMounts(){ static char key[] = "Software\\Cygnus Solutions\\Cygwin\\mounts v2"; HKEY hkey; HKEY hkey1; char upath[1024]; DWORD upathlen; DWORD len; DWORD i; LONG rc; char c; if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, key, 0, KEY_READ, &hkey) != ERROR_SUCCESS) return 0; nmounts = 0; if (RegQueryValueEx (hkey, "cygdrive prefix", NULL, NULL, NULL, &len) == ERROR_SUCCESS) { drvprefix = (char *) malloc (len + 2); RegQueryValueEx (hkey, "cygdrive prefix", NULL, NULL, drvprefix, &len); if (drvprefix[strlen(drvprefix)-1] == '/') drvprefix[strlen(drvprefix)-1] = '\0'; for (c = 'A'; c <= 'Z'; c++) { unix[nmounts] = (char *)malloc(strlen(drvprefix) + 4); sprintf(unix[nmounts], "%s/%c/", drvprefix, c); dos[nmounts] = (char *)malloc(4); sprintf(dos[nmounts], "%c:/", c); index[nmounts] = nmounts; nmounts++; } for (c = 'a'; c <= 'z'; c++) { unix[nmounts] = (char *)malloc(strlen(drvprefix) + 4); sprintf(unix[nmounts], "%s/%c/", drvprefix, c); dos[nmounts] = (char *)malloc(4); sprintf(dos[nmounts], "%c:/", c); index[nmounts] = nmounts; nmounts++; } } for (i = 0; i < MAX_MOUNTS; i++) { upathlen = sizeof(upath); rc = RegEnumKeyEx (hkey, i, upath, &upathlen, NULL, NULL, NULL, NULL); if (rc == ERROR_NO_MORE_ITEMS) break; if (rc != ERROR_SUCCESS) { printf ("RegEnumKeyEx(%d) failed - error %d\n", i, GetLastError()); exit(1); } if (RegOpenKeyEx (hkey, upath, 0, KEY_READ, &hkey1) != ERROR_SUCCESS) { printf ("RegOpenKeyEx() failed - error %d\n", GetLastError()); exit(1); } unix[nmounts] = (char *) malloc (upathlen + 1); strcpy (unix[nmounts], upath); if (RegQueryValueEx (hkey1, "native", NULL, NULL, NULL, &len) != ERROR_SUCCESS) { printf("RegQueryValueEx failed - error %d\n",GetLastError()); exit(1); } if (strcmp (unix[nmounts], "/") == 0) { dos[nmounts] = (char *) malloc (len + 2); RegQueryValueEx (hkey1, "native", NULL, NULL, dos[nmounts], &len); dos[nmounts][len-1] = '\\'; dos[nmounts][len] = 0; } else { dos[nmounts] = (char *) malloc (len + 1); RegQueryValueEx (hkey1, "native", NULL, NULL, dos[nmounts], &len); } nmounts++; } return 1;}#endifintlongest_first (const void *pi, const void *pj){ int i = *(int *) pi; int j = *(int *) pj; return strlen (unix[j]) - strlen (unix[i]);}voidSortMounts(){ int i; for (i = 0; i < nmounts; i++) index[i] = i; qsort (index, nmounts, sizeof(int), longest_first);#ifdef DEBUG_MOUNTS for (i = 0; i < nmounts; i++) printf("SortMounts: i,unix,dos = %d,%s,%s.\n", i,unix[index[i]],dos[index[i]]);#endif}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?