gpt4 book ai didi

c - 是否有 GNU getline 接口(interface)的替代实现?

转载 作者:太空狗 更新时间:2023-10-29 16:42:41 24 4
gpt4 key购买 nike

我目前正在进行的实验使用的软件基础具有复杂的源代码历史并且没有明确定义的许可证。将事情合理化并在固定许可下发布将需要大量工作。

它还打算运行一个随机的 unixish 平台,只有我们支持的一些 libc 有 GNU getline,但现在代码需要它。

有谁知道重新实现 GNU getline在限制较少的许可下可用的语义?

Edit:: 我问是因为 Google 没有帮助,如果可能的话我想避免写一个(这可能是一个有趣的练习,但它不是最好的用途我的时间。)

更具体地说,有问题的接口(interface)是:

ssize_t getline (char **lineptr, size_t *n, FILE *stream);

最佳答案

Will Hartung 的代码存在一个非常严重的问题。 realloc 很可能会释放旧 block 并分配一个新 block ,但代码中的 p 指针将继续指向原始 block 。这个试图通过使用数组索引来解决这个问题。它还尝试更紧密地复制标准 POSIX 逻辑。

/* The original code is public domain -- Will Hartung 4/9/09 */
/* Modifications, public domain as well, by Antti Haapala, 11/10/17
- Switched to getc on 5/23/19 */

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <stdint.h>

// if typedef doesn't exist (msvc, blah)
typedef intptr_t ssize_t;

ssize_t getline(char **lineptr, size_t *n, FILE *stream) {
size_t pos;
int c;

if (lineptr == NULL || stream == NULL || n == NULL) {
errno = EINVAL;
return -1;
}

c = getc(stream);
if (c == EOF) {
return -1;
}

if (*lineptr == NULL) {
*lineptr = malloc(128);
if (*lineptr == NULL) {
return -1;
}
*n = 128;
}

pos = 0;
while(c != EOF) {
if (pos + 1 >= *n) {
size_t new_size = *n + (*n >> 2);
if (new_size < 128) {
new_size = 128;
}
char *new_ptr = realloc(*lineptr, new_size);
if (new_ptr == NULL) {
return -1;
}
*n = new_size;
*lineptr = new_ptr;
}

((unsigned char *)(*lineptr))[pos ++] = c;
if (c == '\n') {
break;
}
c = getc(stream);
}

(*lineptr)[pos] = '\0';
return pos;
}

通过一次锁定流并使用等效于 getc_unlocked(3) 的平台,可以提高性能- 但这些在 C 中没有标准化;如果你使用的是 POSIX 版本,那么你可能会有 getline(3)已经。

关于c - 是否有 GNU getline 接口(interface)的替代实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/735126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com