Exemple #1
0
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
}
Exemple #2
0
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;
}
Exemple #3
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;
}
Exemple #4
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;
		}
Exemple #5
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);
        }
Exemple #6
0
        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);
        }
Exemple #7
0
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;
}
Exemple #8
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);
        }