Are there alternate implementations of GNU getline interface?

后端 未结 5 1228
醉酒成梦
醉酒成梦 2020-11-28 09:48

The experiment I am currently working uses a software base with a complicated source history and no well defined license. It would be a considerable amount of work to ration

5条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-11-28 10:20

    I'm puzzled.

    I looked at the link, read the description, and this is a fine utility.

    But, are you saying you simply can't rewrite this function to spec? The spec seems quite clear,

    Here:

    /* This code is public domain -- Will Hartung 4/9/09 */
    #include 
    #include 
    
    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 minutes, and I haven't written C in 10 years. It minorly breaks the getline contract in that it only checks if the lineptr is NULL, rather than NULL and n == 0. You can fix that if you like. (The other case didn't make a whole lot of sense to me, I guess you could return -1 in that case.)

    Replace the '\n' with a variable to implement "getdelim".

    Do people still write code any more?

提交回复
热议问题