diff options
author | dpeter99 <dpeter99@gmail.com> | 2018-03-26 20:17:16 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-03-26 20:17:16 +0200 |
commit | 52d5f303682fe75925efb9c5f842bd843b75c115 (patch) | |
tree | 1efacdfa380c287133820a0508044f00210d31c4 | |
parent | c47826bb1171083377309e356168b46cb3621df7 (diff) | |
parent | 7b6361a55e47dace4b1cfe36d8dba00a96424ad5 (diff) | |
download | libsurvive-52d5f303682fe75925efb9c5f842bd843b75c115.tar.gz libsurvive-52d5f303682fe75925efb9c5f842bd843b75c115.tar.bz2 |
Merge pull request #1 from jdavidberger/win-update
Made playback work
-rw-r--r-- | src/survive_playback.c | 16 | ||||
-rw-r--r-- | winbuild/getdelim.c | 149 | ||||
-rw-r--r-- | winbuild/libsurvive/libsurvive.vcxproj | 2 | ||||
-rw-r--r-- | winbuild/libsurvive/libsurvive.vcxproj.filters | 6 |
4 files changed, 167 insertions, 6 deletions
diff --git a/src/survive_playback.c b/src/survive_playback.c index de26f73..43a3c0b 100644 --- a/src/survive_playback.c +++ b/src/survive_playback.c @@ -6,7 +6,6 @@ #include <survive.h> #include <string.h> -//#include <sys/time.h> #include "survive_config.h" #include "survive_default_devices.h" @@ -14,6 +13,14 @@ #include "os_generic.h" #include "stdarg.h" +#ifdef _WIN32 +typedef long ssize_t; +#define SSIZE_MAX LONG_MAX + +ssize_t getdelim(char ** lineptr, size_t * n, int delimiter, FILE *stream); +ssize_t getline(char **lineptr, size_t * n, FILE *stream); +#endif + typedef struct SurviveRecordingData { bool alwaysWriteStdOut; bool writeRawLight; @@ -267,14 +274,12 @@ static int playback_poll(struct SurviveContext *ctx, void *_driver) { FILE *f = driver->playback_file; if (f && !feof(f) && !ferror(f)) { - int i; driver->lineno++; char *line; if (driver->next_time_us == 0) { - char *buffer; size_t n = 0; - int r = getdelim(&line, &n, ' ', f); + ssize_t r = getdelim(&line, &n, ' ', f); if (r <= 0) return 0; @@ -290,9 +295,8 @@ static int playback_poll(struct SurviveContext *ctx, void *_driver) { return 0; driver->next_time_us = 0; - char *buffer; size_t n = 0; - int r = getline(&line, &n, f); + ssize_t r = getline(&line, &n, f); if (r <= 0) return 0; diff --git a/winbuild/getdelim.c b/winbuild/getdelim.c new file mode 100644 index 0000000..ca808ab --- /dev/null +++ b/winbuild/getdelim.c @@ -0,0 +1,149 @@ +/* Implementations of the getdelim() and getline() functions from POSIX 2008, + just in case your libc doesn't have them. + + getdelim() reads from a stream until a specified delimiter is encountered. + getline() reads from a stream until a newline is encountered. + + See: http://pubs.opengroup.org/onlinepubs/9699919799/functions/getdelim.html + + NOTE: It is always the caller's responsibility to free the line buffer, even + when an error occurs. + + Copyright (c) 2011 James E. Ingram + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + + +#include <errno.h> +#include <limits.h> +#include <stdlib.h> +#include <stdio.h> + + +#if __STDC_VERSION__ >= 199901L +/* restrict is a keyword */ +#else +# define restrict +#endif + + +#ifndef _POSIX_SOURCE +typedef long ssize_t; +#define SSIZE_MAX LONG_MAX +#endif + + +ssize_t getdelim(char **restrict lineptr, size_t *restrict n, int delimiter, + FILE *restrict stream); +ssize_t getline(char **restrict lineptr, size_t *restrict n, + FILE *restrict stream); + + + +#define _GETDELIM_GROWBY 128 /* amount to grow line buffer by */ +#define _GETDELIM_MINLEN 4 /* minimum line buffer size */ + + +ssize_t getdelim(char **restrict lineptr, size_t *restrict n, int delimiter, + FILE *restrict stream) +{ + char *buf, *pos; + int c; + ssize_t bytes; + + if (lineptr == NULL || n == NULL) { + errno = EINVAL; + return -1; + } + if (stream == NULL) { + errno = EBADF; + return -1; + } + + /* resize (or allocate) the line buffer if necessary */ + buf = *lineptr; + if (buf == NULL || *n < _GETDELIM_MINLEN) { + buf = realloc(*lineptr, _GETDELIM_GROWBY); + if (buf == NULL) { + /* ENOMEM */ + return -1; + } + *n = _GETDELIM_GROWBY; + *lineptr = buf; + } + + /* read characters until delimiter is found, end of file is reached, or an + error occurs. */ + bytes = 0; + pos = buf; + while ((c = getc(stream)) != EOF) { + if (bytes + 1 >= SSIZE_MAX) { + errno = EOVERFLOW; + return -1; + } + bytes++; + if (bytes >= *n - 1) { + buf = realloc(*lineptr, *n + _GETDELIM_GROWBY); + if (buf == NULL) { + /* ENOMEM */ + return -1; + } + *n += _GETDELIM_GROWBY; + pos = buf + bytes - 1; + *lineptr = buf; + } + + *pos++ = (char) c; + if (c == delimiter) { + break; + } + } + + if (ferror(stream) || (feof(stream) && (bytes == 0))) { + /* EOF, or an error from getc(). */ + return -1; + } + + *pos = '\0'; + return bytes; +} + + +ssize_t getline(char **restrict lineptr, size_t *restrict n, + FILE *restrict stream) +{ + return getdelim(lineptr, n, '\n', stream); +} + + +#ifdef _TEST_GETDELIM + +/* TODO: this isn't a very extensive test. */ +int main(void) +{ + char *line = NULL; + size_t n = 0; + while (getline(&line, &n, stdin) > 0) { + printf("%s", line); + } + return 0; +} + +#endif diff --git a/winbuild/libsurvive/libsurvive.vcxproj b/winbuild/libsurvive/libsurvive.vcxproj index 3ce9dd3..bf1ae2d 100644 --- a/winbuild/libsurvive/libsurvive.vcxproj +++ b/winbuild/libsurvive/libsurvive.vcxproj @@ -163,12 +163,14 @@ <ClCompile Include="..\..\src\survive_default_devices.c" /> <ClCompile Include="..\..\src\survive_disambiguator.c" /> <ClCompile Include="..\..\src\survive_driverman.c" /> + <ClCompile Include="..\..\src\survive_playback.c" /> <ClCompile Include="..\..\src\survive_process.c" /> <ClCompile Include="..\..\src\survive_reproject.c" /> <ClCompile Include="..\..\src\survive_sensor_activations.c" /> <ClCompile Include="..\..\src\survive_turveybiguator.c" /> <ClCompile Include="..\..\src\survive_usb.c" /> <ClCompile Include="..\..\src\survive_vive.c" /> + <ClCompile Include="..\getdelim.c" /> </ItemGroup> <ItemGroup> <ClInclude Include="..\..\include\libsurvive\poser.h" /> diff --git a/winbuild/libsurvive/libsurvive.vcxproj.filters b/winbuild/libsurvive/libsurvive.vcxproj.filters index e96e220..d2dc6ba 100644 --- a/winbuild/libsurvive/libsurvive.vcxproj.filters +++ b/winbuild/libsurvive/libsurvive.vcxproj.filters @@ -108,6 +108,12 @@ <ClCompile Include="..\..\src\survive_sensor_activations.c"> <Filter>Source Files</Filter> </ClCompile> + <ClCompile Include="..\..\src\survive_playback.c"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\getdelim.c"> + <Filter>Source Files</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\..\src\ootx_decoder.h"> |