13

私が現在取り組んでいる実験では、ソース履歴が複雑で、ライセンスが明確に定義されていないソフトウェア ベースを使用しています。合理化して固定ライセンスでリリースするのはかなりの労力を要します。

また、ランダムな unixish プラットフォームを実行することも意図しており、サポートしている libc の一部のみが GNU getline を備えていますが、現在、コードはそれを想定しています。

制限の少ないライセンスで利用できるGNUgetlineセマンティクスの再実装を知っている人はいますか?

編集:: Google が役に立たなかったので質問します。できれば書くのは避けたいです (楽しい練習になるかもしれませんが、時間を最大限に活用することはできません)。

より具体的には、問題のインターフェイスは次のとおりです。

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

5 に答える 5

18

私は困惑しています。

リンクを見て説明を読んだところ、これは優れたユーティリティです。

しかし、この関数を仕様に書き直すことはできないと言っているのですか? 仕様はかなり明確に見えますが、

ここ:

/* This code is public domain -- Will Hartung 4/9/09 */
#include <stdio.h>
#include <stdlib.h>

size_t getline(char **lineptr, size_t *n, FILE *stream) {
    char *bufptr = NULL;
    char *p = bufptr;
    size_t size;
    int c;

    if (lineptr == NULL) {
        return -1;
    }
    if (stream == NULL) {
        return -1;
    }
    if (n == NULL) {
        return -1;
    }
    bufptr = *lineptr;
    size = *n;

    c = fgetc(stream);
    if (c == EOF) {
        return -1;
    }
    if (bufptr == NULL) {
        bufptr = malloc(128);
        if (bufptr == NULL) {
            return -1;
        }
        size = 128;
    }
    p = bufptr;
    while(c != EOF) {
        if ((p - bufptr) > (size - 1)) {
            size = size + 128;
            bufptr = realloc(bufptr, size);
            if (bufptr == NULL) {
                return -1;
            }
        }
        *p++ = c;
        if (c == '\n') {
            break;
        }
        c = fgetc(stream);
    }

    *p++ = '\0';
    *lineptr = bufptr;
    *n = size;

    return p - bufptr - 1;
}

int main(int argc, char** args) {
    char *buf = NULL; /*malloc(10);*/
    int bufSize = 0; /*10;*/

    printf("%d\n", bufSize);
    int charsRead =  getline(&buf, &bufSize, stdin);

    printf("'%s'", buf);
    printf("%d\n", bufSize);
    return 0;
}

15 分、私は 10 年間 C を書いていません。lineptr が NULL および n == 0 ではなく NULL であるかどうかのみをチェックするという点で、getline 契約をわずかに破ります。必要に応じて修正できます。(他のケースは私にはあまり意味がありませんでした。その場合は -1 を返すことができると思います。)

「\n」を変数に置き換えて、「getdelim」を実装します。

人々はまだコードを書いていますか?

于 2009-04-09T18:55:17.103 に答える
3

BSD 用にコンパイルする場合は、 代わりにfgetlnを使用してください

于 2011-07-09T19:33:22.443 に答える