diff options
-rw-r--r-- | src/library.js | 38 | ||||
-rw-r--r-- | src/library_fs.js | 4 | ||||
-rw-r--r-- | src/library_tty.js | 41 | ||||
-rw-r--r-- | src/settings.js | 6 | ||||
-rw-r--r-- | tests/module/test_stdin.c | 57 | ||||
-rw-r--r-- | tests/msvc10/glbook_10_MultiTexture.vcxproj | 4 | ||||
-rw-r--r-- | tests/msvc10/glbook_11_Multisample.vcxproj | 4 | ||||
-rw-r--r-- | tests/msvc10/glbook_11_Stencil_Test.vcxproj | 4 | ||||
-rw-r--r-- | tests/msvc10/glbook_13_ParticleSystem.vcxproj | 4 | ||||
-rw-r--r-- | tests/msvc10/glbook_15_Hello_Triangle_KD.vcxproj | 4 | ||||
-rw-r--r-- | tests/msvc10/glbook_2_Hello_Triangle.vcxproj | 4 | ||||
-rw-r--r-- | tests/msvc10/glbook_8_Simple_VertexShader.vcxproj | 4 | ||||
-rw-r--r-- | tests/msvc10/glbook_9_MipMap2D.vcxproj | 4 | ||||
-rw-r--r-- | tests/msvc10/glbook_9_Simple_Texture2D.vcxproj | 4 | ||||
-rw-r--r-- | tests/msvc10/glbook_9_Simple_TextureCubemap.vcxproj | 4 | ||||
-rw-r--r-- | tests/msvc10/glbook_9_TextureWrap.vcxproj | 4 | ||||
-rw-r--r-- | tests/termios/test_tcgetattr.c | 61 | ||||
-rw-r--r-- | tests/test_core.py | 4 | ||||
-rw-r--r-- | tests/test_other.py | 19 | ||||
-rw-r--r-- | tools/file_packager.py | 2 | ||||
-rw-r--r-- | tools/jsrun.py | 3 |
21 files changed, 225 insertions, 54 deletions
diff --git a/src/library.js b/src/library.js index 3ba2f56b..f6b3d5ef 100644 --- a/src/library.js +++ b/src/library.js @@ -2261,7 +2261,11 @@ LibraryManager.library = { // void clearerr(FILE *stream); // http://pubs.opengroup.org/onlinepubs/000095399/functions/clearerr.html stream = FS.getStream(stream); - if (stream) stream.error = false; + if (!stream) { + return; + } + stream.eof = false; + stream.error = false; }, fclose__deps: ['close', 'fsync'], fclose: function(stream) { @@ -2322,7 +2326,6 @@ LibraryManager.library = { if (streamObj.eof || streamObj.error) return -1; var ret = _fread(_fgetc.ret, 1, 1, stream); if (ret == 0) { - streamObj.eof = true; return -1; } else if (ret == -1) { streamObj.error = true; @@ -5154,6 +5157,37 @@ LibraryManager.library = { }, // ========================================================================== + // termios.h + // ========================================================================== + tcgetattr: function(fildes, termios_p) { + // http://pubs.opengroup.org/onlinepubs/009695399/functions/tcgetattr.html + var stream = FS.getStream(fildes); + if (!stream) { + ___setErrNo(ERRNO_CODES.EBADF); + return -1; + } + if (!stream.tty) { + ___setErrNo(ERRNO_CODES.ENOTTY); + return -1; + } + return 0; + }, + + tcsetattr: function(fildes, optional_actions, termios_p) { + // http://pubs.opengroup.org/onlinepubs/7908799/xsh/tcsetattr.html + var stream = FS.getStream(fildes); + if (!stream) { + ___setErrNo(ERRNO_CODES.EBADF); + return -1; + } + if (!stream.tty) { + ___setErrNo(ERRNO_CODES.ENOTTY); + return -1; + } + return 0; + }, + + // ========================================================================== // time.h // ========================================================================== diff --git a/src/library_fs.js b/src/library_fs.js index 63ad7c8d..1d9748d3 100644 --- a/src/library_fs.js +++ b/src/library_fs.js @@ -510,7 +510,7 @@ mergeInto(LibraryManager.library, { return FS.create(path, mode); }, createDataFile: function(parent, name, data, canRead, canWrite, canOwn) { - var path = PATH.join(typeof parent === 'string' ? parent : FS.getPath(parent), name); + var path = name ? PATH.join(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent; var mode = FS.getMode(canRead, canWrite); var node = FS.create(path, mode); if (data) { @@ -770,7 +770,7 @@ mergeInto(LibraryManager.library, { Browser.init(); // TODO we should allow people to just pass in a complete filename instead // of parent and name being that we just join them anyways - var fullname = PATH.resolve(PATH.join(parent, name)); + var fullname = name ? PATH.resolve(PATH.join(parent, name)) : parent; function processData(byteArray) { function finish(byteArray) { if (!dontCreateFile) { diff --git a/src/library_tty.js b/src/library_tty.js index 8f44cd07..53239989 100644 --- a/src/library_tty.js +++ b/src/library_tty.js @@ -1,17 +1,35 @@ mergeInto(LibraryManager.library, { $TTY__deps: ['$FS'], + $TTY__postset: '__ATINIT__.unshift({ func: function() { TTY.init() } });' + + '__ATEXIT__.push({ func: function() { TTY.shutdown() } });' + + 'TTY.utf8 = new Runtime.UTF8Processor();', $TTY: { ttys: [], + init: function () { + if (ENVIRONMENT_IS_NODE) { + // currently, FS.init does not distinguish if process.stdin is a file or TTY + // device, it always assumes it's a TTY device. because of this, we're forcing + // process.stdin to UTF8 encoding to at least make stdin reading compatible + // with text files until FS.init can be refactored. + process['stdin']['setEncoding']('utf8'); + } + }, + shutdown: function() { + if (ENVIRONMENT_IS_NODE) { + // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? + // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation + // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? + // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle + // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call + process['stdin']['pause'](); + } + }, register: function(dev, ops) { TTY.ttys[dev] = { input: [], output: [], ops: ops }; FS.registerDevice(dev, TTY.stream_ops); }, stream_ops: { open: function(stream) { - // this wouldn't be required if the library wasn't eval'd at first... - if (!TTY.utf8) { - TTY.utf8 = new Runtime.UTF8Processor(); - } var tty = TTY.ttys[stream.node.rdev]; if (!tty) { throw new FS.ErrnoError(ERRNO_CODES.ENODEV); @@ -66,17 +84,22 @@ mergeInto(LibraryManager.library, { return i; } }, - // NOTE: This is weird to support stdout and stderr - // overrides in addition to print and printErr overrides. default_tty_ops: { + // get_char has 3 particular return values: + // a.) the next character represented as an integer + // b.) undefined to signal that no data is currently available + // c.) null to signal an EOF get_char: function(tty) { if (!tty.input.length) { var result = null; if (ENVIRONMENT_IS_NODE) { - if (process.stdin.destroyed) { - return undefined; + result = process['stdin']['read'](); + if (!result) { + if (process['stdin']['_readableState'] && process['stdin']['_readableState']['ended']) { + return null; // EOF + } + return undefined; // no data available } - result = process.stdin.read(); } else if (typeof window != 'undefined' && typeof window.prompt == 'function') { // Browser. diff --git a/src/settings.js b/src/settings.js index 03b4ed64..02423ba5 100644 --- a/src/settings.js +++ b/src/settings.js @@ -874,9 +874,9 @@ var C_DEFINES = { 'SOCK_DGRAM': '2', 'SOCK_STREAM': '1', 'STDC_HEADERS': '1', - 'STDERR_FILENO': '2', - 'STDIN_FILENO': '0', - 'STDOUT_FILENO': '1', + 'STDERR_FILENO': '3', + 'STDIN_FILENO': '1', + 'STDOUT_FILENO': '2', 'S_BLKSIZE': '1024', 'S_ENFMT': '0002000', 'S_IEXEC': '0000100', diff --git a/tests/module/test_stdin.c b/tests/module/test_stdin.c new file mode 100644 index 00000000..4838d466 --- /dev/null +++ b/tests/module/test_stdin.c @@ -0,0 +1,57 @@ +#include <errno.h> +#include <fcntl.h> +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#if EMSCRIPTEN +#include <emscripten.h> +#endif + +int line = 0; + +void main_loop(void *arg) +{ + char str[10] = {0}; + int ret; + + errno = 0; + while (errno != EAGAIN) { + if (line == 0) { + ret = fgetc(stdin); + if (ret != EOF) putc(ret, stdout); + if (ret == '\n') line++; + } else if (line > 0) { + ret = scanf("%10s", str); + if (ret > 0) puts(str); + } + + if (ferror(stdin) && errno != EAGAIN) { + puts("error"); + exit(EXIT_FAILURE); + } + + if (feof(stdin)) { + puts("eof"); + exit(EXIT_SUCCESS); + } + + clearerr(stdin); + } +} + +int main(int argc, char const *argv[]) +{ + fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); + + // SM shell doesn't implement an event loop and therefor doesn't support + // emscripten_set_main_loop. However, its stdin reads are sync so it + // should exit out after calling main_loop once. + main_loop(NULL); + +#if EMSCRIPTEN + emscripten_set_main_loop(main_loop, 60, 0); +#else + while (1) main_loop(NULL); sleep(1); +#endif + return 0; +}
\ No newline at end of file diff --git a/tests/msvc10/glbook_10_MultiTexture.vcxproj b/tests/msvc10/glbook_10_MultiTexture.vcxproj index b59fda0a..a831f351 100644 --- a/tests/msvc10/glbook_10_MultiTexture.vcxproj +++ b/tests/msvc10/glbook_10_MultiTexture.vcxproj @@ -82,12 +82,12 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemGroup> diff --git a/tests/msvc10/glbook_11_Multisample.vcxproj b/tests/msvc10/glbook_11_Multisample.vcxproj index ae5170be..47d5fb4a 100644 --- a/tests/msvc10/glbook_11_Multisample.vcxproj +++ b/tests/msvc10/glbook_11_Multisample.vcxproj @@ -82,12 +82,12 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemGroup> diff --git a/tests/msvc10/glbook_11_Stencil_Test.vcxproj b/tests/msvc10/glbook_11_Stencil_Test.vcxproj index d72d7fa6..3a541128 100644 --- a/tests/msvc10/glbook_11_Stencil_Test.vcxproj +++ b/tests/msvc10/glbook_11_Stencil_Test.vcxproj @@ -82,12 +82,12 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemGroup> diff --git a/tests/msvc10/glbook_13_ParticleSystem.vcxproj b/tests/msvc10/glbook_13_ParticleSystem.vcxproj index 458d76fa..c18e17ff 100644 --- a/tests/msvc10/glbook_13_ParticleSystem.vcxproj +++ b/tests/msvc10/glbook_13_ParticleSystem.vcxproj @@ -82,12 +82,12 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemGroup> diff --git a/tests/msvc10/glbook_15_Hello_Triangle_KD.vcxproj b/tests/msvc10/glbook_15_Hello_Triangle_KD.vcxproj index 654164b3..489628f5 100644 --- a/tests/msvc10/glbook_15_Hello_Triangle_KD.vcxproj +++ b/tests/msvc10/glbook_15_Hello_Triangle_KD.vcxproj @@ -82,12 +82,12 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemGroup> diff --git a/tests/msvc10/glbook_2_Hello_Triangle.vcxproj b/tests/msvc10/glbook_2_Hello_Triangle.vcxproj index b992294d..34de0780 100644 --- a/tests/msvc10/glbook_2_Hello_Triangle.vcxproj +++ b/tests/msvc10/glbook_2_Hello_Triangle.vcxproj @@ -92,12 +92,12 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> diff --git a/tests/msvc10/glbook_8_Simple_VertexShader.vcxproj b/tests/msvc10/glbook_8_Simple_VertexShader.vcxproj index fb01c1da..19442df9 100644 --- a/tests/msvc10/glbook_8_Simple_VertexShader.vcxproj +++ b/tests/msvc10/glbook_8_Simple_VertexShader.vcxproj @@ -82,12 +82,12 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemGroup> diff --git a/tests/msvc10/glbook_9_MipMap2D.vcxproj b/tests/msvc10/glbook_9_MipMap2D.vcxproj index 1d747d1d..af0e072b 100644 --- a/tests/msvc10/glbook_9_MipMap2D.vcxproj +++ b/tests/msvc10/glbook_9_MipMap2D.vcxproj @@ -82,12 +82,12 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemGroup> diff --git a/tests/msvc10/glbook_9_Simple_Texture2D.vcxproj b/tests/msvc10/glbook_9_Simple_Texture2D.vcxproj index d9232e5d..09ff3e1e 100644 --- a/tests/msvc10/glbook_9_Simple_Texture2D.vcxproj +++ b/tests/msvc10/glbook_9_Simple_Texture2D.vcxproj @@ -82,12 +82,12 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemGroup> diff --git a/tests/msvc10/glbook_9_Simple_TextureCubemap.vcxproj b/tests/msvc10/glbook_9_Simple_TextureCubemap.vcxproj index c5c6ee1b..d89da1c7 100644 --- a/tests/msvc10/glbook_9_Simple_TextureCubemap.vcxproj +++ b/tests/msvc10/glbook_9_Simple_TextureCubemap.vcxproj @@ -82,12 +82,12 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemGroup> diff --git a/tests/msvc10/glbook_9_TextureWrap.vcxproj b/tests/msvc10/glbook_9_TextureWrap.vcxproj index 6cfbb0c8..54f51e26 100644 --- a/tests/msvc10/glbook_9_TextureWrap.vcxproj +++ b/tests/msvc10/glbook_9_TextureWrap.vcxproj @@ -82,12 +82,12 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Emscripten'"> <ClCompile> - <AdditionalIncludeDirectories>$(SolutionDir)../glbook/Common</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../glbook/Common</AdditionalIncludeDirectories> </ClCompile> </ItemDefinitionGroup> <ItemGroup> diff --git a/tests/termios/test_tcgetattr.c b/tests/termios/test_tcgetattr.c new file mode 100644 index 00000000..2b3780ee --- /dev/null +++ b/tests/termios/test_tcgetattr.c @@ -0,0 +1,61 @@ +#include <assert.h> +#include <errno.h> +#include <fcntl.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <termios.h> +#include <unistd.h> + +static void create_file(const char *path, const char *buffer, int mode) { + int fd = open(path, O_WRONLY | O_CREAT | O_EXCL, mode); + assert(fd >= 0); + + int err = write(fd, buffer, sizeof(char) * strlen(buffer)); + assert(err == (sizeof(char) * strlen(buffer))); + + close(fd); +} + +void setup() { + create_file("test.txt", "abcdefg", 0666); +} + +void cleanup() { + unlink("test.txt"); +} + +void test() { + struct termios tc; + int ret; + int fd; + + fd = open("test.txt", O_RDONLY); + + ret = tcgetattr(fd, &tc); + assert(ret == -1); + assert(errno = ENOTTY); + + ret = tcgetattr(STDIN_FILENO, &tc); + assert(!ret); + + ret = tcsetattr(fd, 0, &tc); + assert(ret == -1); + assert(errno = ENOTTY); + + ret = tcsetattr(STDIN_FILENO, 0, &tc); + assert(!ret); + + close(fd); + + puts("success"); +} + +int main() { + atexit(cleanup); + signal(SIGABRT, cleanup); + setup(); + test(); + return EXIT_SUCCESS; +} diff --git a/tests/test_core.py b/tests/test_core.py index 94245060..491db66c 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -4675,6 +4675,10 @@ The current type of b is: 9 expected = open(path_from_root('tests', 'pthread', 'specific.c.txt'), 'r').read() self.do_run(src, expected, force_c=True) + def test_tcgetattr(self): + src = open(path_from_root('tests', 'termios', 'test_tcgetattr.c'), 'r').read() + self.do_run(src, 'success', force_c=True) + def test_time(self): # XXX Not sure what the right output is here. Looks like the test started failing with daylight savings changes. Modified it to pass again. src = open(path_from_root('tests', 'time', 'src.c'), 'r').read() diff --git a/tests/test_other.py b/tests/test_other.py index a6813b07..eaa5b0d8 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -929,20 +929,11 @@ f.close() self.assertContained('libf1\nlibf2\n', run_js(os.path.join(self.get_dir(), 'a.out.js'))) def test_stdin(self): - open('main.cpp', 'w').write(r''' -#include <stdio.h> -int main(int argc, char const *argv[]) -{ - char str[10] = {0}; - scanf("%10s", str); - printf("%s\n", str); - return 0; -} -''') - Building.emcc('main.cpp', output_filename='a.out.js') - open('in.txt', 'w').write('abc') - # node's stdin support is broken - self.assertContained('abc', Popen(listify(SPIDERMONKEY_ENGINE) + ['a.out.js'], stdin=open('in.txt'), stdout=PIPE, stderr=PIPE).communicate()[0]) + Building.emcc(path_from_root('tests', 'module', 'test_stdin.c'), output_filename='a.out.js') + open('in.txt', 'w').write('abcdef\nghijkl') + + for engine in JS_ENGINES: + self.assertContained('abcdef\nghijkl\neof', run_js(os.path.join(self.get_dir(), 'a.out.js'), engine=engine, stdin=open('in.txt'))) def test_ungetc_fscanf(self): open('main.cpp', 'w').write(r''' diff --git a/tools/file_packager.py b/tools/file_packager.py index 8a1f1ba5..8f0f8be8 100644 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -360,7 +360,7 @@ if has_preloaded: }, finish: function(byteArray) { var that = this; - Module['FS_createPreloadedFile'](PATH.dirname(this.name), PATH.basename(this.name), byteArray, true, true, function() { + Module['FS_createPreloadedFile'](this.name, null, byteArray, true, true, function() { Module['removeRunDependency']('fp ' + that.name); }, function() { if (that.audio) { diff --git a/tools/jsrun.py b/tools/jsrun.py index 571e9cee..91038f6e 100644 --- a/tools/jsrun.py +++ b/tools/jsrun.py @@ -12,13 +12,14 @@ def timeout_run(proc, timeout, note='unnamed process', full_output=False): out = proc.communicate() return '\n'.join(out) if full_output else out[0] -def run_js(filename, engine=None, args=[], check_timeout=False, stdout=PIPE, stderr=None, cwd=None, full_output=False): +def run_js(filename, engine=None, args=[], check_timeout=False, stdin=None, stdout=PIPE, stderr=None, cwd=None, full_output=False): if type(engine) is not list: engine = [engine] command = engine + [filename] + (['--'] if 'd8' in engine[0] or 'jsc' in engine[0] else []) + args return timeout_run( Popen( command, + stdin=stdin, stdout=stdout, stderr=stderr, cwd=cwd), |