C++ Lecture 1

[Lecture Index] [Next Lecture]

grow-c.c

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

struct growing_buffer {
    char *buf;
    int n_used;
    int size;
};

int
buffer_init(struct growing_buffer *gb)
{
    gb->size = 16;
    gb->n_used = 0;
    gb->buf = (char *) malloc(gb->size);
    if (!gb->buf)
        return 0;
    return 1;
}

int
buffer_addc(struct growing_buffer *gb, char c)
{
    if (!gb->buf)     /* previous failure */
        return 0;
    if (gb->n_used >= gb->size) {
        gb->size *= 2;
        gb->buf = (char *) realloc(gb->buf, gb->size);
        if (!gb->buf) {
            gb->n_used = 0;
            gb->size = 0;
            return 0;
        }
    }
    gb->buf[gb->n_used++] = c;
    return 1;
}

void
buffer_reset(struct growing_buffer *gb)
{
    gb->n_used = 0;
}

void
buffer_release(struct growing_buffer *gb)
{
    free(gb->buf);
}

int
readline(FILE *fp, struct growing_buffer *gb)
{
    int c;

    buffer_reset(gb);
    while ((c = fgetc(fp)) != EOF) {
        if (!buffer_addc(gb, c))
            return -1;
        if (c == '\n')
            break;
    }
    if (!buffer_addc(gb, '\0'))
        return -1;
    return gb->n_used - 1;
}

int
main(int argc, char **argv)
{
    int i;
    int lineno;
    int ecode = 0;
    FILE *fp;
    struct growing_buffer gbuf;

    if (!buffer_init(&gbuf)) {
        fprintf(stderr, "can't initialize buffer\n");
        return 1;
    }
    for (i = 1; i < argc; i++) {
        fp = fopen(argv[i], "r");
        if (!fp) {
            fprintf(stderr, "can't open %s - %s\n",
                argv[i], strerror(errno));
            ecode = 1;
            continue;
        }
        lineno = 1;
        while (readline(fp, &gbuf) > 0) {
            printf("%d %s", lineno, gbuf.buf);
            lineno++;
        }
        fclose(fp);
    }
    buffer_release(&gbuf);
    return ecode;
}

grow-1-c++.cc

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

struct growing_buffer {
    char *buf;
    int n_used;
    int size;

    int init();
    int addc(char c);
    void reset();
    void release();
};

int
growing_buffer::init()
{
    size = 16;
    n_used = 0;
    buf = (char *) malloc(size);
    if (!buf)
        return 0;
    return 1;
}

int
growing_buffer::addc(char c)
{
    if (!buf)    /* previous failure */
        return 0;
    if (n_used >= size) {
        size *= 2;
        buf = (char *) realloc(buf, size);
        if (!buf) {
            n_used = 0;
            size = 0;
            return 0;
        }
    }
    buf[n_used++] = c;
    return 1;
}

void
growing_buffer::reset()
{
    n_used = 0;
}

void
growing_buffer::release()
{
    free(buf);
}

int
readline(FILE *fp, struct growing_buffer *gb)
{
    int c;

    gb->reset();
    while ((c = fgetc(fp)) != EOF) {
        if (!gb->addc(c))
            return -1;
        if (c == '\n')
            break;
    }
    if (!gb->addc('\0'))
        return -1;
    return gb->n_used - 1;
}

int
main(int argc, char **argv)
{
    int i;
    int lineno;
    int ecode = 0;
    FILE *fp;
    struct growing_buffer gbuf;

    if (!gbuf.init()) {
        fprintf(stderr, "can't initialize buffer\n");
        return 1;
    }
    for (i = 1; i < argc; i++) {
        fp = fopen(argv[i], "r");
        if (!fp) {
            fprintf(stderr, "can't open %s - %s\n",
                argv[i], strerror(errno));
            ecode = 1;
            continue;
        }
        lineno = 1;
        while (readline(fp, &gbuf) > 0) {
            printf("%d %s", lineno, gbuf.buf);
            lineno++;
        }
        fclose(fp);
    }
    gbuf.release();

    return ecode;
}

grow-2-c++.cc


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

class Growing_buffer {
    char *buf;
    int n_used;
    int size;

public:
    // Constructor
    Growing_buffer();
    void addc(char c);
    void reset();
    int getlen() { return n_used; }
    char * getbuf() { return buf; }
    // Destructor
    ~Growing_buffer();
};

Growing_buffer::Growing_buffer()
{
    size = 16;
    n_used = 0;
    buf = new char[size];
}

void
Growing_buffer::addc(char c)
{
    if (n_used >= size) {
        char *nbuf;

        size *= 2;
        nbuf = new char[size];
        memcpy(nbuf, buf, size / 2);
        delete [] buf;
        buf = nbuf;
    }
    buf[n_used++] = c;
}

void
Growing_buffer::reset()
{
    n_used = 0;
}

Growing_buffer::~Growing_buffer()
{
    delete [] buf;
}

int
readline(FILE *fp, Growing_buffer *gb)
{
    int c;

    gb->reset();
    while ((c = fgetc(fp)) != EOF) {
        if (!gb->addc(c))
            return -1;
        if (c == '\n')
            break;
    }
    if (!gb->addc('\0'))
        return -1;
    return gb->getlen() - 1;
}

int
main(int argc, char **argv)
{
    int i;
    int lineno;
    int ecode = 0;
    FILE *fp;
    Growing_buffer gbuf;

    for (i = 1; i < argc; i++) {
        fp = fopen(argv[i], "r");
        if (!fp) {
            fprintf(stderr, "can't open %s - %s\n",
                argv[i], strerror(errno));
            ecode = 1;
            continue;
        }
        lineno = 1;
        while (readline(fp, &gbuf) > 0) {
            printf("%d %s", lineno, gbuf.getbuf());
            lineno++;
        }
        fclose(fp);
    }
    return ecode;
}

[Lecture Index] [Next Lecture]