PageRenderTime 62ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 0ms

/windows/src/Winport/Sysdep/sysmisc.cpp

https://github.com/coliveira/wintexmacs-copy
C++ | 799 lines | 546 code | 190 blank | 63 comment | 136 complexity | 434ab176f36cb33c7a4d45a0f419619e MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, GPL-2.0, LGPL-2.0, GPL-3.0
  1. /******************************************************************************
  2. * MODULE : sysmisc.cpp
  3. * DESCRIPTION: Windows version of various POSIX functions
  4. * COPYRIGHT : (C) 2003 Dan Martens dan_martens@lycos.com
  5. *******************************************************************************
  6. * This software falls under the GNU general public license and comes WITHOUT
  7. * ANY WARRANTY WHATSOEVER. See the file $TEXMACS_PATH/LICENSE for more details.
  8. * If you don't have this file, write to the Free Software Foundation, Inc.,
  9. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  10. ******************************************************************************/
  11. #include <stdlib.h>
  12. #include <windows.h>
  13. #include <time.h>
  14. #include <stdio.h>
  15. #include <shellapi.h>
  16. #include <sys/misc.h>
  17. #include <sys/socket.h>
  18. #define BUFFER_SIZE 1024
  19. typedef struct BUFFER_STRUCT_{
  20. char *buffer;
  21. DWORD bufferSize;
  22. }BUFFER_STRUCT;
  23. BUFFER_STRUCT getEnvBuffer = {NULL, 0};
  24. void GetLocaleLanguage(char *buffer);
  25. int ShellOut(char *file, char *operation);
  26. int WaitForProcess(HANDLE process);
  27. int HandlePkCompilation(char *command);
  28. int HandleTfmCompilation(char *command);
  29. char* stristr(char *theString, char *toSearch);
  30. int RunGhostScript(char *cmd);
  31. int HandleModifierMapRequest(char *commandLine);
  32. void ReplaceArg(char *theString, char *argString, char *replaceString);
  33. bool SysMiscInitialize(){
  34. /* char path[1024], texHome[1024], *temp;
  35. temp = getenv("Path");
  36. sprintf(path, "%s;", temp);
  37. temp = getenv("TEX_HOME");
  38. if(!temp)
  39. return false;
  40. sprintf(texHome, "%s\\miktex\\bin", temp);
  41. strcat(path, texHome);
  42. printf("%s", path);
  43. setenv("Path", path, 0);
  44. */
  45. return true;
  46. }
  47. void ConvertPathing(char *toConvert){
  48. if(!toConvert)
  49. return;
  50. for(int i = 0; i < strlen(toConvert); i++){
  51. if(toConvert[i] == '/')
  52. toConvert[i] = '\\';
  53. }
  54. }
  55. int gettimeofday(struct timeval *tp, void *tzp){
  56. SYSTEMTIME sysTime;
  57. GetSystemTime(&sysTime);
  58. tp->tv_sec = time(NULL);
  59. tp->tv_usec = sysTime.wMilliseconds * 1000;
  60. return 0;
  61. }
  62. int setenv(const char *name, const char *value, int rewrite){
  63. // printf("Call to setenv, %s=%s\n", name, value);
  64. if(SetEnvironmentVariable(name, value))
  65. return 1;
  66. else
  67. return 0;
  68. return 0;
  69. }
  70. OS_VERSION GetOsVersion(){
  71. OSVERSIONINFO vInfo;
  72. vInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  73. GetVersionEx(&vInfo);
  74. switch(vInfo.dwMajorVersion){
  75. case 3: return OS_VERSION_WIN_NT351;
  76. case 4:
  77. switch(vInfo.dwMinorVersion){
  78. case 0:
  79. switch(vInfo.dwPlatformId){
  80. case VER_PLATFORM_WIN32_WINDOWS:
  81. return OS_VERSION_WIN_95;
  82. case VER_PLATFORM_WIN32_NT:
  83. return OS_VERSION_WIN_NT40;
  84. default:
  85. return OS_VERSION_UNSUPPORTED;
  86. }
  87. case 10: return OS_VERSION_WIN_98;
  88. case 90: return OS_VERSION_WIN_ME;
  89. default: return OS_VERSION_UNSUPPORTED;
  90. }
  91. case 5:
  92. switch(vInfo.dwMinorVersion){
  93. case 0: return OS_VERSION_WIN_2000;
  94. case 1: return OS_VERSION_WIN_XP;
  95. case 2: return OS_VERSION_WIN_SERVER_2003;
  96. default: return OS_VERSION_UNSUPPORTED;
  97. }
  98. default: return OS_VERSION_UNSUPPORTED;
  99. }
  100. }
  101. bool SetBufferSize(BUFFER_STRUCT *buffer, DWORD size){
  102. if(buffer->bufferSize >= size)
  103. return true;
  104. if((buffer->buffer = (char*)realloc(buffer->buffer, size)) == NULL)
  105. return false;
  106. buffer->bufferSize = size;
  107. memset(buffer->buffer, 0, buffer->bufferSize);
  108. return true;
  109. }
  110. char* getenv(char *name){
  111. char temp[BUFFER_SIZE];
  112. OS_VERSION version;
  113. //printf("Call to getenv, %s\n", name);
  114. memset(getEnvBuffer.buffer, 0, getEnvBuffer.bufferSize);
  115. version = GetOsVersion();
  116. strcpy(temp, name);
  117. if(strcmp(name, "TEXMACS_STYLE_PATH") == 0)
  118. int x = 1;
  119. if(temp[0] == '$')
  120. memcpy(temp, &temp[1], strlen(temp));
  121. if(strcmp(temp, "HOME") == 0){
  122. if((version == OS_VERSION_WIN_2000)
  123. || (version == OS_VERSION_WIN_XP)
  124. || (version == OS_VERSION_WIN_SERVER_2003)
  125. || (version == OS_VERSION_WIN_NT40))
  126. strcpy(temp, "USERPROFILE");
  127. else
  128. strcpy(temp, "TEXMACS_PATH");
  129. }
  130. if(strcmp(temp, "LANG") == 0){
  131. SetBufferSize(&getEnvBuffer, 100);
  132. GetLocaleLanguage(getEnvBuffer.buffer);
  133. //printf("Returning value %s=%s\n", name, getEnvBuffer.buffer);
  134. return getEnvBuffer.buffer;
  135. }
  136. else{
  137. getVariable:
  138. int retVal = GetEnvironmentVariable(temp, getEnvBuffer.buffer, getEnvBuffer.bufferSize);
  139. if((retVal > 0) && (retVal <= getEnvBuffer.bufferSize)){
  140. //printf("Returning value %s=%s\n", name, getEnvBuffer.buffer);
  141. return getEnvBuffer.buffer;
  142. }
  143. else if((retVal > getEnvBuffer.bufferSize) && SetBufferSize(&getEnvBuffer, (DWORD)retVal)){
  144. goto getVariable;
  145. }
  146. else{
  147. //printf("Invalid Environment Variable, returning NULL");
  148. return NULL;
  149. }
  150. }
  151. }
  152. char* ExpandEnvString(char *toExpand){
  153. static char returnBuffer[MAX_PATH];
  154. char tempBuffer[MAX_PATH];
  155. int len;
  156. strcpy(tempBuffer, toExpand);
  157. len = strlen(tempBuffer);
  158. for(int i = 0; i < len; i++){
  159. if(tempBuffer[i] == '$'){
  160. tempBuffer[i] = '%';
  161. for(int x = i; x <= len; x++){
  162. if((tempBuffer[x] == '\\')
  163. || (tempBuffer[x] == '\"')
  164. || (x == len)){
  165. memcpy(&tempBuffer[x + 1], &tempBuffer[x], (len - x) + 1);
  166. tempBuffer[x] = '%';
  167. len++;
  168. break;
  169. }
  170. i++;
  171. }
  172. }
  173. }
  174. ExpandEnvironmentStrings(tempBuffer, returnBuffer, MAX_PATH);
  175. return returnBuffer;
  176. }
  177. char* GetWorkingDirectory(){
  178. static char buffer[1024];
  179. GetCurrentDirectory(1024, buffer);
  180. return buffer;
  181. }
  182. void GetLocaleLanguage(char *buffer){
  183. LANGID langid;
  184. char *ptr;
  185. langid = GetSystemDefaultLangID();
  186. switch(langid){
  187. case 0x0809: ptr = "en_GB"; break;
  188. case 0x0405: ptr = "cs_CZ"; break;
  189. case 0x0413:
  190. case 0x0813: ptr = "nl_NL"; break;
  191. case 0x0409:
  192. case 0x0c09:
  193. case 0x1009:
  194. case 0x1409:
  195. case 0x1809:
  196. case 0x1c09:
  197. case 0x2009:
  198. case 0x2409:
  199. case 0x2809:
  200. case 0x2c09:
  201. case 0x3009:
  202. case 0x3409: ptr = "en_US"; break;
  203. case 0x040c:
  204. case 0x080c:
  205. case 0x0c0c:
  206. case 0x100c:
  207. case 0x140c:
  208. case 0x180c: ptr = "fr_FR"; break;
  209. case 0x0407:
  210. case 0x0807:
  211. case 0x0c07:
  212. case 0x1007:
  213. case 0x1407: ptr = "de_DE"; break;
  214. case 0x040e: ptr = "hu_HU"; break;
  215. case 0x0410:
  216. case 0x0810: ptr = "it_IT"; break;
  217. case 0x0415: ptr = "pl_PL"; break;
  218. case 0x0416:
  219. case 0x0816: ptr = "pt_PT"; break;
  220. case 0x0418: ptr = "ro_RO"; break;
  221. case 0x0419: ptr = "ru_RU"; break;
  222. case 0x040a:
  223. case 0x080a:
  224. case 0x0c0a:
  225. case 0x100a:
  226. case 0x140a:
  227. case 0x180a:
  228. case 0x1c0a:
  229. case 0x200a:
  230. case 0x240a:
  231. case 0x280a:
  232. case 0x2c0a:
  233. case 0x300a:
  234. case 0x340a:
  235. case 0x380a:
  236. case 0x3c0a:
  237. case 0x400a:
  238. case 0x440a:
  239. case 0x480a:
  240. case 0x4c0a:
  241. case 0x500a: ptr = "es_ES"; break;
  242. case 0x041d:
  243. case 0x081d: ptr = "sv_SV"; break;
  244. case 0x0422: ptr = "uk_UA"; break;
  245. default: ptr = "en_US"; break;
  246. }
  247. strcpy(buffer, ptr);
  248. }
  249. void QuoteArgs(char **toQuote, int numArgs){
  250. char *ptr;
  251. int len;
  252. len = strlen(*toQuote);
  253. ptr = *toQuote;
  254. for(int i = 0; i < numArgs; i++){
  255. while(isalpha(*ptr)) ptr++;
  256. while(isspace(*ptr)) ptr++;
  257. if(*ptr == '\"'){
  258. ptr++;
  259. while(*ptr != '\"') ptr++;
  260. }
  261. else{
  262. memcpy(ptr + 1, ptr, len - (ptr - *toQuote) + 1);
  263. len++;
  264. *ptr = '\"';
  265. while(!isspace(*ptr) && (*ptr != '\0')) ptr++;
  266. memcpy(ptr + 1, ptr, len - (ptr - *toQuote) + 1);
  267. len++;
  268. *ptr = '\"';
  269. }
  270. ptr++;
  271. *toQuote = ptr;
  272. }
  273. }
  274. int _system(char *command){
  275. char temp[1024];
  276. char *ptr, *ptr2, *ptr3;
  277. int len;
  278. bool doneParsing = false;
  279. strcpy(temp, command);
  280. len = strlen(temp);
  281. ptr = temp;
  282. //printf("Call to _system to run \"%s\"\n", command);
  283. for(int i = 0; i < len; i++){
  284. if(temp[i] == '$'){
  285. temp[i] = '%';
  286. for(int x = i; x <= len; x++){
  287. if((temp[x] == '\\')
  288. || (temp[x] == '\"')
  289. || (x == len)){
  290. memcpy(&temp[x + 1], &temp[x], (len - x) + 1);
  291. temp[x] = '%';
  292. len++;
  293. break;
  294. }
  295. i++;
  296. }
  297. }
  298. }
  299. while(!doneParsing){
  300. len = strlen(ptr);
  301. /*if((ptr2 = strstr(ptr, "mkdir")) != NULL){
  302. ptr2 += 6;
  303. memcpy(ptr2 + 1, ptr2, len - (ptr2 - temp) + 1);
  304. len++;
  305. *ptr2 = '\"';
  306. ptr2++;
  307. while((*ptr2 != '\0')
  308. && (*ptr2 != '>')
  309. && (*ptr2 != '<')
  310. && (*ptr2 != '|'))
  311. ptr2++;
  312. memcpy(ptr2 + 1, ptr2, len - (ptr2 - temp) + 1);
  313. len++;
  314. *ptr2 = '\"';
  315. ptr = ptr2;
  316. }*/
  317. if((ptr2 = strstr(ptr, "mkdir ")) != NULL){
  318. // QuoteArgs(&ptr2, 1);
  319. }
  320. else if((ptr2 = strstr(ptr, "cp ")) != NULL){
  321. memcpy(ptr2 + 2, ptr2, len - (ptr2 - temp) + 1);
  322. ptr2[0] = 'c';
  323. ptr2[1] = 'o';
  324. ptr2[2] = 'p';
  325. ptr2[3] = 'y';
  326. ptr2[4] = ' ';
  327. // QuoteArgs(&ptr2, 2);
  328. }
  329. else if((ptr2 = strstr(ptr, "cat ")) != NULL){
  330. memcpy(ptr2 + 1, ptr2, len - (ptr2 - temp) + 1);
  331. ptr2[0] = 't';
  332. ptr2[1] = 'y';
  333. ptr2[2] = 'p';
  334. ptr2[3] = 'e';
  335. ptr2[4] = ' ';
  336. // QuoteArgs(&ptr2, 1);
  337. while((*ptr2 == ' ') || (*ptr2 == '>') && (*ptr2 != '\0')) ptr2++;
  338. // QuoteArgs(&ptr2, 1);
  339. }
  340. else if((ptr2 = strstr(ptr, "pwd ")) != NULL){
  341. memcpy(ptr2 + 2, ptr2 + 3, len - (ptr2 - temp) + 1);
  342. ptr2[0] = 'c';
  343. ptr2[1] = 'd';
  344. ptr2[2] = ' ';
  345. }
  346. else if((ptr2 = strstr(ptr, "rm ")) != NULL){
  347. ReplaceArg(ptr2, "-f", "/Q");
  348. memcpy(ptr2 + 1, ptr2, len - (ptr2 - temp) + 1);
  349. ptr2[0] = 'd';
  350. ptr2[1] = 'e';
  351. ptr2[2] = 'l';
  352. ptr2[3] = ' ';
  353. // QuoteArgs(&ptr2, 1);
  354. }
  355. if((ptr2 = strstr(ptr, "lpr ")) != NULL){
  356. return ShellOut(ptr2 + 4, "print");
  357. }
  358. else if ((ptr2 = strstr(ptr, "ghostview ")) != NULL){
  359. return ShellOut(ptr2 + 10, "open");
  360. }
  361. else if ((ptr2 = strstr(ptr, "gs ")) != NULL){
  362. return RunGhostScript(ptr2 + 3);
  363. }
  364. else if ((ptr2 = stristr(ptr, "makepk ")) != NULL){
  365. return HandlePkCompilation(ptr2);
  366. }
  367. else if ((ptr2 = stristr(ptr, "maketfm ")) != NULL){
  368. return HandleTfmCompilation(ptr2);
  369. }
  370. else if((ptr2 = stristr(ptr, "xmodmap ")) != NULL){
  371. return HandleModifierMapRequest(ptr2);
  372. }
  373. else
  374. doneParsing = true;
  375. ptr = ptr2;
  376. }
  377. //printf("_system converted UNIX command \"%s\" to Windows command \"%s\"\n", command, temp);
  378. return system(temp);
  379. //return system(ExpandEnvString(temp));
  380. }
  381. void ReplaceArg(char *theString, char *argString, char *replaceString){
  382. char *ptr;
  383. int length1, length2, length3;
  384. ptr = strstr(theString, argString);
  385. if(ptr == NULL) return;
  386. length3 = strlen(theString);
  387. length1 = strlen(argString);
  388. length2 = strlen(replaceString);
  389. if(length1 < length2)
  390. memcpy(ptr, ptr + (length2 - length1), length3 - (ptr - theString));
  391. else if(length1 > length2)
  392. memcpy(ptr + (length1 - length2), ptr - (length1 - length2), length3 - (ptr - theString));
  393. memcpy(ptr, replaceString, length2);
  394. }
  395. char* stristr(char *theString, char *toSearch){
  396. int length = strlen(theString);
  397. char *copyString;
  398. char *copySearch;
  399. char *ret;
  400. int i;
  401. copyString = (char*)malloc(strlen(theString) + 1);
  402. copySearch = (char*)malloc(strlen(toSearch) + 1);
  403. strcpy(copyString, theString);
  404. strcpy(copySearch, toSearch);
  405. for(i = 0; i < length; i++)
  406. copyString[i] = tolower(copyString[i]);
  407. length = strlen(toSearch);
  408. for(i = 0; i < length; i++)
  409. copySearch[i] = tolower(copySearch[i]);
  410. ret = strstr(copyString, copySearch);
  411. free(copySearch);
  412. free(copyString);
  413. if(!ret)
  414. return NULL;
  415. return theString + (ret - copyString);
  416. }
  417. int RunGhostScript(char *cmd){
  418. char command[MAX_PATH + 100];
  419. int length = strlen(cmd);
  420. char *cmdPtr, *commandPtr;
  421. strcpy(command, "\"%GS_PATH%\\gs*\\bin\\gswin32.exe\" -dNODISPLAY ");
  422. cmdPtr = cmd;
  423. commandPtr = command + strlen(command);
  424. while(*cmdPtr != '\0'){
  425. if(!((cmdPtr + 3) > (cmd + length))
  426. && (*cmdPtr == '=')
  427. && (*(cmdPtr + 1) == 'x')
  428. && (*(cmdPtr + 2) == '1')
  429. && (*(cmdPtr + 3) == '1')
  430. && (*(cmdPtr + 4) == ' ')){
  431. memcpy(commandPtr, "#mswindll ", strlen("#mswindll "));
  432. cmdPtr += strlen("x11 ");
  433. commandPtr += strlen("#mswindll ");
  434. continue;
  435. }
  436. *commandPtr = *cmdPtr;
  437. commandPtr++;
  438. cmdPtr++;
  439. }
  440. *commandPtr = '\0';
  441. return system(ExpandEnvString(ExpandEnvString(command)));
  442. }
  443. int HandleTfmCompilation(char *command){
  444. system(command);
  445. return 1;
  446. }
  447. int HandlePkCompilation(char *command){
  448. char *ptr;
  449. char directory[MAX_PATH];
  450. char dpi[10];
  451. char name[MAX_PATH];
  452. char oldFileName[MAX_PATH];
  453. char newFileName[MAX_PATH];
  454. int i, argCount, x;
  455. char endChar;
  456. endChar = ' ';
  457. if(ptr = strstr(command, "--dest-dir ")){
  458. i = 0;
  459. ptr += strlen("--dest-dir ");
  460. if(ptr[i] == '"'){
  461. endChar = '"';
  462. ptr++;
  463. }
  464. while(ptr[i] != endChar){
  465. directory[i] = ptr[i];
  466. i++;
  467. }
  468. directory[i] = '\0';
  469. }
  470. else if(ptr = strstr(command, "-D ")){
  471. i = 0;
  472. ptr += strlen("-D ");
  473. while(ptr[i] != endChar){
  474. directory[i] = ptr[i];
  475. i++;
  476. }
  477. directory[i] = '\0';
  478. }
  479. else {
  480. return system(command);
  481. }
  482. ptr = stristr(command, "makepk ");
  483. ptr += strlen("makepk ");
  484. i = 0;
  485. argCount = 1;
  486. while(true){
  487. while(isspace(ptr[i])) i++;
  488. if(ptr[i] == '-'){
  489. while(!isspace(ptr[i])) i++;
  490. while(isspace(ptr[i])) i++;
  491. while(ptr[i] == endChar) i++;
  492. while(ptr[i] != endChar) i++;
  493. while(ptr[i] == endChar) i++;
  494. }
  495. else{
  496. argCount++;
  497. if(argCount == 2){
  498. x = 0;
  499. while(!isspace(ptr[i])) {
  500. name[x] = ptr[i];
  501. i++;
  502. x++;
  503. }
  504. name[x] = '\0';
  505. }
  506. if(argCount == 3){
  507. x = 0;
  508. while(isalnum(ptr[i])) {
  509. dpi[x] = ptr[i];
  510. i++;
  511. x++;
  512. }
  513. dpi[x] = '\0';
  514. break;
  515. }
  516. while(!isspace(ptr[i])) i++;
  517. while(isspace(ptr[i])) i++;
  518. }
  519. }
  520. sprintf(oldFileName, "%s\\%s.pk", directory, name);
  521. sprintf(newFileName, "%s\\%s.%spk", directory, name, dpi);
  522. system(command);
  523. if(!MoveFileEx(oldFileName, newFileName,
  524. MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED)){
  525. DeleteFile(oldFileName);
  526. return 0;
  527. }
  528. return 1;
  529. }
  530. int ShellOut(char *file, char *operation){
  531. char *fileName;
  532. SHELLEXECUTEINFO executeInfo;
  533. memset(&executeInfo, 0, sizeof(SHELLEXECUTEINFO));
  534. fileName = file;
  535. int i = 0;
  536. // while(isspace(fileName[i])) i++;
  537. // while(!isspace(fileName[i]) && (fileName[i] != '\0')) i++;
  538. // fileName[i] = '\0';
  539. executeInfo.cbSize = sizeof(SHELLEXECUTEINFO);
  540. executeInfo.fMask = SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_DDEWAIT | SEE_MASK_NOCLOSEPROCESS;
  541. executeInfo.hwnd = GetDesktopWindow();
  542. executeInfo.lpVerb = operation;
  543. executeInfo.lpFile = fileName;
  544. executeInfo.nShow = SW_SHOWNORMAL;
  545. //if((int)ShellExecute(GetDesktopWindow(), "print", fileName, NULL, NULL, SW_SHOWNORMAL) < 32){
  546. ShellExecuteEx(&executeInfo);
  547. if((int)executeInfo.hInstApp < 32){
  548. MessageBox(NULL, "Unable to print postscript file, please install ghostscript",
  549. "Print Failure", MB_OK | MB_ICONERROR);
  550. return 0;
  551. }
  552. WaitForProcess(executeInfo.hProcess);
  553. return 1;
  554. }
  555. int WaitForProcess(HANDLE process){
  556. DWORD status;
  557. while(GetExitCodeProcess(process, &status) != 0){
  558. if(status != STILL_ACTIVE){
  559. return 1;
  560. }
  561. Sleep(1000);
  562. }
  563. return 0;
  564. }
  565. int HandleModifierMapRequest(char *commandLine){
  566. return 1;
  567. }
  568. int select(int n,fd_set *readfds,fd_set *writefds,
  569. fd_set *exceptfds, timeval *timeout){
  570. Sleep(timeout->tv_sec * 100 + timeout->tv_usec / 100);
  571. return 0;
  572. }
  573. //int execve(const char *filename,char *const argv [],
  574. // char *const envp[]);
  575. int pipe(int *fildes){
  576. return 0;
  577. }
  578. int fork(){
  579. return 0;
  580. }
  581. int close(int fildes){
  582. if(SOCKET_IsSocket(fildes))
  583. return SOCKET_close(fildes);
  584. else
  585. return ERROR;
  586. }
  587. size_t read(int d, void *buf, size_t nbytes){
  588. if(SOCKET_IsSocket(d))
  589. return SOCKET_read(d, buf, nbytes);
  590. return ERROR;
  591. }
  592. int wait(int *status){
  593. return 0;
  594. }
  595. size_t write(int d, const void *buf, size_t nbytes){
  596. if(SOCKET_IsSocket(d))
  597. return SOCKET_write(d, buf, nbytes);
  598. return ERROR;
  599. }
  600. int kill(pid_t pid, int sig){
  601. return 0;
  602. }