result_t path_base::fullpath(exlib::string path, exlib::string &retVal) { #ifdef _WIN32 exlib::wstring str = utf8to16String(path); exlib::wchar utf16_buffer[MAX_PATH]; DWORD utf16_len = GetFullPathNameW(str.c_str(), MAX_PATH, utf16_buffer, NULL); if (!utf16_len) return CHECK_ERROR(LastError()); retVal = utf16to8String(utf16_buffer, (int32_t)utf16_len); return 0; #else if (isPathSlash(path.c_str()[0])) return normalize(path, retVal); exlib::string str; process_base::cwd(str); str.append(1, PATH_SLASH); str.append(path); return normalize(str, retVal); #endif }
result_t fs_base::readdir(const char *path, obj_ptr<List_base> &retVal, AsyncEvent *ac) { if (!ac) return CHECK_ERROR(CALL_E_NOSYNC); WIN32_FIND_DATAW fd; HANDLE hFind; wstring fpath; obj_ptr<List> oa; fpath = utf8to16String(path); fpath.append(L"\\*", 2); hFind = FindFirstFileW(fpath.c_str(), &fd); if (hFind == INVALID_HANDLE_VALUE) return CHECK_ERROR(LastError()); oa = new List(); do { obj_ptr<Stat> pStat = new Stat(); pStat->fill(fd); oa->append(pStat); } while (FindNextFileW(hFind, &fd)); FindClose(hFind); retVal = oa; return 0; }
result_t process_base::chdir(const char *directory) { wstring str = utf8to16String(directory); wchar utf16_buffer[MAX_PATH]; DWORD utf16_len; wchar drive_letter; if (!SetCurrentDirectoryW(str.c_str())) return CHECK_ERROR(LastError()); utf16_len = GetCurrentDirectoryW(MAX_PATH, utf16_buffer); if (utf16_len == 0) return CHECK_ERROR(LastError()); if (utf16_buffer[utf16_len - 1] == L'\\' && !(utf16_len == 3 && utf16_buffer[1] == L':')) { utf16_len--; utf16_buffer[utf16_len] = L'\0'; } if (utf16_len < 2 || utf16_buffer[1] != L':') drive_letter = 0; else if (utf16_buffer[0] >= L'A' && utf16_buffer[0] <= L'Z') drive_letter = utf16_buffer[0]; else if (utf16_buffer[0] >= L'a' && utf16_buffer[0] <= L'z') drive_letter = utf16_buffer[0] - L'a' + L'A'; else drive_letter = 0; if (drive_letter != 0) { wchar env_var[4]; env_var[0] = L'='; env_var[1] = drive_letter; env_var[2] = L':'; env_var[3] = L'\0'; if (!SetEnvironmentVariableW(env_var, utf16_buffer)) return CHECK_ERROR(LastError()); } return 0; }
result_t ParseJsonString(v8::Local<v8::Value> &retVal) { wstring str; Advance(); while (c0_ != '"') { if (c0_ >= 0 && c0_ < 0x20) return ReportUnexpectedCharacter(); if (c0_ != '\\') { int32_t beg_pos = position_; while (c0_ != '"' && c0_ != '\\') { Advance(); if (c0_ >= 0 && c0_ < 0x20) return ReportUnexpectedCharacter(); } str.append(utf8to16String(source_ + beg_pos, position_ - beg_pos)); } else { Advance(); switch (c0_) { case '"': case '\\': case '/': str.append(1, c0_); break; case 'b': str.append(1, '\x08'); break; case 'f': str.append(1, '\x0c'); break; case 'n': str.append(1, '\x0a'); break; case 'r': str.append(1, '\x0d'); break; case 't': str.append(1, '\x09'); break; case 'u': { uint16_t value = 0; for (int32_t i = 0; i < 4; i++) { Advance(); if (!qisxdigit(c0_)) return ReportUnexpectedCharacter(); value = value * 16 + qhex(c0_); } str.append(1, value); break; } default: return ReportUnexpectedCharacter(); } Advance(); } } AdvanceSkipWhitespace(); retVal = v8::String::NewFromTwoByte(isolate->m_isolate, (const uint16_t*)str.c_str(), v8::String::kNormalString, (int32_t) str.length()); return 0; }
void out(const char *s, FILE *stream) { wstring ws = utf8to16String(s); wchar *ptr = &ws[0]; wchar *ptr2; while (ptr2 = (wchar *) qstrchr(ptr, L'\x1b')) { if (ptr2[1] == '[') { ptr2[0] = 0; fputws(ptr, stream); fflush(stream); ptr2 += 2; while (true) { if (ptr2[0] == 'm') { m_Now = m_wAttr; m_wLight = m_wAttr & FOREGROUND_INTENSITY; SetConsoleTextAttribute(m_handle, m_Now); ptr2 ++; break; } if (qisdigit(ptr2[0])) { if (ptr2[1] == 'm') { if (ptr2[0] == '0') { m_Now = m_wAttr; m_wLight = m_wAttr & FOREGROUND_INTENSITY; SetConsoleTextAttribute(m_handle, m_Now); } ptr2 += 2; break; } WORD mask, val; WORD light = m_wLight; if (ptr2[1] == ';') { if (ptr2[0] == '0') m_wLight = light = 0; else if (ptr2[0] == '1') m_wLight = light = FOREGROUND_INTENSITY; ptr2 += 2; } if (ptr2[0] == '3') { mask = 0xf0; ptr2 ++; } else if (ptr2[0] == '4') { mask = 0x0f; ptr2 ++; } else if (ptr2[0] == '9') { mask = 0xf0; light |= FOREGROUND_INTENSITY; ptr2 ++; } else if (ptr2[0] == '1' && ptr2[1] == '0') { mask = 0x0f; light |= FOREGROUND_INTENSITY << 4; ptr2 += 2; } else break; if (!qisdigit(ptr2[0])) break; val = ptr2[0] - '0'; if (val != 8) { if (val == 9) { val = (m_wAttr & 0x0f) | (m_Now & 0xf0); m_Now = val | light; SetConsoleTextAttribute(m_handle, m_Now); } else { val = (val & 2) | ((val & 1) ? 4 : 0) | ((val & 4) ? 1 : 0); if (mask == 0x0f) val <<= 4; m_Now = (m_Now & mask) | val | light; SetConsoleTextAttribute(m_handle, m_Now); } } ptr2 ++; if (ptr2[0] == 'm') { ptr2 ++; break; } } } } ptr = ptr2; } fputws(ptr, stream); fflush(stream); }
void out(exlib::string& s) { static HANDLE s_console; if (!m_tty) { fwrite(s.c_str(), 1, s.length(), stdout); return; } if (!m_handle) { if (!s_console) { AllocConsole(); freopen("CONIN$", "r", stdin); freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); s_console = GetStdHandle(STD_OUTPUT_HANDLE); } m_handle = s_console; m_Now = m_wAttr = 0x7; m_wLight = m_wAttr & FOREGROUND_INTENSITY; } exlib::wstring ws = utf8to16String(s); exlib::wchar* ptr = &ws[0]; exlib::wchar* pend = ptr + ws.length(); exlib::wchar* ptr2; while (ptr2 = (exlib::wchar*)qstrchr(ptr, L'\x1b')) { if (ptr2[1] == '[') { WriteConsole(ptr, ptr2 - ptr); ptr2 += 2; while (true) { if (ptr2[0] == 'm') { m_Now = m_wAttr; m_wLight = m_wAttr & FOREGROUND_INTENSITY; SetConsoleTextAttribute(m_handle, m_Now); ptr2++; break; } if (qisdigit(ptr2[0])) { if (ptr2[1] == 'm') { if (ptr2[0] == '0') { m_Now = m_wAttr; m_wLight = m_wAttr & FOREGROUND_INTENSITY; SetConsoleTextAttribute(m_handle, m_Now); } ptr2 += 2; break; } WORD mask, val; WORD light = m_wLight; if (ptr2[1] == ';') { if (ptr2[0] == '0') m_wLight = light = 0; else if (ptr2[0] == '1') m_wLight = light = FOREGROUND_INTENSITY; ptr2 += 2; } if (ptr2[0] == '3') { mask = 0xf0; ptr2++; } else if (ptr2[0] == '4') { mask = 0x0f; ptr2++; } else if (ptr2[0] == '9') { mask = 0xf0; light |= FOREGROUND_INTENSITY; ptr2++; } else if (ptr2[0] == '1' && ptr2[1] == '0') { mask = 0x0f; light |= FOREGROUND_INTENSITY << 4; ptr2 += 2; } else break; if (!qisdigit(ptr2[0])) break; val = ptr2[0] - '0'; if (val != 8) { if (val == 9) { val = (m_wAttr & 0x0f) | (m_Now & 0xf0); m_Now = val | light; SetConsoleTextAttribute(m_handle, m_Now); } else { val = (val & 2) | ((val & 1) ? 4 : 0) | ((val & 4) ? 1 : 0); if (mask == 0x0f) val <<= 4; m_Now = (m_Now & mask) | val | light; SetConsoleTextAttribute(m_handle, m_Now); } } ptr2++; if (ptr2[0] == 'm') { ptr2++; break; } } } } ptr = ptr2; } WriteConsole(ptr, pend - ptr); }
result_t SubProcess::create(const char* command, v8::Local<v8::Array> args, v8::Local<v8::Object> opts, bool redirect, obj_ptr<SubProcess_base>& retVal) { result_t hr; PROCESS_INFORMATION pi; STARTUPINFOW si; int32_t len = args->Length(); int32_t i; HANDLE cin_pipe[2] = {0}; HANDLE cout_pipe[2] = {0}; wstring wstr(L"cmd /C "); wstr.append(utf8to16String(command)); Isolate* isolate = Isolate::current(); for (i = 0; i < len; i ++) { std::string str; hr = GetArgumentValue(isolate->m_isolate, args->Get(i), str); if (hr < 0) return hr; wstr.append(1, ' '); wstr.append(utf8to16String(str)); } ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); if (redirect) { hr = create_name_pipe(&cin_pipe[0], &cin_pipe[1], true); if (hr < 0) return hr; hr = create_name_pipe(&cout_pipe[0], &cout_pipe[1], false); if (hr < 0) { ::CloseHandle(cin_pipe[0]); ::CloseHandle(cin_pipe[1]); return hr; } si.hStdError = GetStdHandle(STD_ERROR_HANDLE); si.hStdOutput = cout_pipe[1]; si.hStdInput = cin_pipe[1]; si.dwFlags |= STARTF_USESTDHANDLES; } wstring envstr; v8::Local<v8::Object> envs; hr = GetConfigValue(isolate->m_isolate, opts, "env", envs, true); if (hr == CALL_E_PARAMNOTOPTIONAL) hr = process_base::get_env(envs); if (hr < 0) return hr; v8::Local<v8::Array> keys = envs->GetPropertyNames(); len = (int32_t) keys->Length(); for (i = 0; i < len; i++) { v8::Local<v8::Value> k = keys->Get(i); v8::Local<v8::Value> v = envs->Get(k); std::string ks, vs; hr = GetArgumentValue(k, ks); if (hr < 0) return hr; hr = GetArgumentValue(v, vs); if (hr < 0) return hr; ks.append(1, '='); ks.append(vs); envstr.append(utf8to16String(ks)); envstr.append(1, 0); } envstr.append(1, 0); if (!CreateProcessW(NULL, &wstr[0], NULL, NULL, TRUE, CREATE_UNICODE_ENVIRONMENT, &envstr[0], NULL, &si, &pi)) { ::CloseHandle(cin_pipe[0]); ::CloseHandle(cin_pipe[1]); ::CloseHandle(cout_pipe[0]); ::CloseHandle(cout_pipe[1]); return CHECK_ERROR(LastError()); } ::CloseHandle(pi.hThread); obj_ptr<SubProcess> sub = new SubProcess((intptr_t)pi.hProcess); if (redirect) { ::CloseHandle(cin_pipe[1]); ::CloseHandle(cout_pipe[1]); wrap_pipe((intptr_t)cin_pipe[0], sub->m_stdin); wrap_pipe((intptr_t)cout_pipe[0], sub->m_stdout); } retVal = sub; return 0; }
void out(exlib::string& s) { exlib::wstring ws = utf8to16String(s); exlib::wchar *ptr = &ws[0]; exlib::wchar *pend = ptr + ws.length(); exlib::wchar *ptr2; DWORD dwWrite; while (ptr2 = (exlib::wchar *) qstrchr(ptr, L'\x1b')) { if (ptr2[1] == '[') { WriteConsoleW(m_handle, ptr, (DWORD)(ptr2 - ptr), &dwWrite, NULL); ptr2 += 2; while (true) { if (ptr2[0] == 'm') { m_Now = m_wAttr; m_wLight = m_wAttr & FOREGROUND_INTENSITY; SetConsoleTextAttribute(m_handle, m_Now); ptr2 ++; break; } if (qisdigit(ptr2[0])) { if (ptr2[1] == 'm') { if (ptr2[0] == '0') { m_Now = m_wAttr; m_wLight = m_wAttr & FOREGROUND_INTENSITY; SetConsoleTextAttribute(m_handle, m_Now); } ptr2 += 2; break; } WORD mask, val; WORD light = m_wLight; if (ptr2[1] == ';') { if (ptr2[0] == '0') m_wLight = light = 0; else if (ptr2[0] == '1') m_wLight = light = FOREGROUND_INTENSITY; ptr2 += 2; } if (ptr2[0] == '3') { mask = 0xf0; ptr2 ++; } else if (ptr2[0] == '4') { mask = 0x0f; ptr2 ++; } else if (ptr2[0] == '9') { mask = 0xf0; light |= FOREGROUND_INTENSITY; ptr2 ++; } else if (ptr2[0] == '1' && ptr2[1] == '0') { mask = 0x0f; light |= FOREGROUND_INTENSITY << 4; ptr2 += 2; } else break; if (!qisdigit(ptr2[0])) break; val = ptr2[0] - '0'; if (val != 8) { if (val == 9) { val = (m_wAttr & 0x0f) | (m_Now & 0xf0); m_Now = val | light; SetConsoleTextAttribute(m_handle, m_Now); } else { val = (val & 2) | ((val & 1) ? 4 : 0) | ((val & 4) ? 1 : 0); if (mask == 0x0f) val <<= 4; m_Now = (m_Now & mask) | val | light; SetConsoleTextAttribute(m_handle, m_Now); } } ptr2 ++; if (ptr2[0] == 'm') { ptr2 ++; break; } } } } ptr = ptr2; } WriteConsoleW(m_handle, ptr, (DWORD)(pend - ptr), &dwWrite, NULL); }