瀏覽代碼

add posix functions getline/getdelim

mysterywolf 4 年之前
父節點
當前提交
a41ebbb697

+ 30 - 0
components/libc/getline/README.md

@@ -0,0 +1,30 @@
+# getline/getdelim for RT-Thread POSIX
+
+[![Build Status](https://travis-ci.org/ivanrad/getline.svg?branch=master)](https://travis-ci.org/ivanrad/getline)
+
+https://github.com/ivanrad/getline
+
+Read a delimited record from stream.
+
+Yet another (hopefully portable C) implementation of getline/getdelim.
+These are ersatz functions, a drop-in replacement, to be used on those occasions when your C library does not already support them.
+
+For more details, see [Open Group Base Specification for getdelim/getline][opengroup-spec].
+
+## Building the project
+
+Just run `make`.
+
+## License
+
+This code is unlicensed -- free and released into the public domain. See `UNLICENSE` file for more information.
+
+[opengroup-spec]: http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html
+
+
+## 联系&维护
+Meco Man 
+
+jiantingman@foxmail.com
+
+https://github.com/mysterywolf/getline

+ 13 - 0
components/libc/getline/SConscript

@@ -0,0 +1,13 @@
+# RT-Thread building script for component
+
+from building import *
+
+cwd = GetCurrentDir()
+src = Glob('*.c') + Glob('*.cpp')
+CPPPATH = [cwd]
+
+group = DefineGroup('libc', src, 
+    depend = ['RT_USING_LIBC', 'RT_USING_POSIX'], 
+    CPPPATH = CPPPATH)
+
+Return('group')

+ 24 - 0
components/libc/getline/UNLICENSE

@@ -0,0 +1,24 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+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 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.
+
+For more information, please refer to <http://unlicense.org/>

+ 78 - 0
components/libc/getline/posix_getline.c

@@ -0,0 +1,78 @@
+/* posix_getline.c
+ * RT-Thread POSIX
+ * getdelim(), getline() - read a delimited record from stream, ersatz implementation
+ * https://man7.org/linux/man-pages/man3/getline.3.html
+ * Authors:
+ *     https://github.com/ivanrad/getline
+ *     https://github.com/mysterywolf/getline/
+ * 
+ * Meco Man    2020-09-03    First Version
+ */
+
+#include <posix_getline.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <limits.h>
+
+ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream) {
+    char *cur_pos, *new_lineptr;
+    size_t new_lineptr_len;
+    int c;
+
+    if (lineptr == NULL || n == NULL || stream == NULL) {
+        errno = EINVAL;
+        return -1;
+    }
+
+    if (*lineptr == NULL) {
+        *n = 128; /* init len */
+        if ((*lineptr = (char *)malloc(*n)) == NULL) {
+            errno = ENOMEM;
+            return -1;
+        }
+    }
+
+    cur_pos = *lineptr;
+    for (;;) {
+        c = getc(stream);
+
+        if (ferror(stream) || (c == EOF && cur_pos == *lineptr))
+            return -1;
+
+        if (c == EOF)
+            break;
+
+        if ((*lineptr + *n - cur_pos) < 2) {
+            if (SSIZE_MAX / 2 < *n) {
+#ifdef EOVERFLOW
+                errno = EOVERFLOW;
+#else
+                errno = ERANGE; /* no EOVERFLOW defined */
+#endif
+                return -1;
+            }
+            new_lineptr_len = *n * 2;
+
+            if ((new_lineptr = (char *)realloc(*lineptr, new_lineptr_len)) == NULL) {
+                errno = ENOMEM;
+                return -1;
+            }
+            cur_pos = new_lineptr + (cur_pos - *lineptr);
+            *lineptr = new_lineptr;
+            *n = new_lineptr_len;
+        }
+
+        *cur_pos++ = (char)c;
+
+        if (c == delim)
+            break;
+    }
+
+    *cur_pos = '\0';
+    return (ssize_t)(cur_pos - *lineptr);
+}
+
+ssize_t getline(char **lineptr, size_t *n, FILE *stream) {
+    return getdelim(lineptr, n, '\n', stream);
+}
+

+ 22 - 0
components/libc/getline/posix_getline.h

@@ -0,0 +1,22 @@
+/* posix_getline.h
+ * RT-Thread POSIX
+ * getdelim(), getline() - read a delimited record from stream, ersatz implementation
+ * https://man7.org/linux/man-pages/man3/getline.3.html
+ * Authors:
+ *     https://github.com/ivanrad/getline
+ *     https://github.com/mysterywolf/getline/
+ *
+ * Meco Man    2020-09-03    First Version
+ */
+
+
+#ifndef POSIX_GETLINE_H
+#define POSIX_GETLINE_H
+
+#include <stdio.h>
+
+ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);
+ssize_t getline(char **lineptr, size_t *n, FILE *stream);
+
+#endif /* POSIX_GETLINE_H */
+