static void sizecheck()

in src/dxapi/native/util/logger.cpp [106:146]


static void sizecheck(struct Logger * const self)
{
    if (NULL == self) return;
    char tempbuffer[DEBUG_COPY_BUFFER_SIZE];
    unsigned long fsz, rd_pos, wr_pos;		// file size
    long left;		// number of bytes to copy
    int t;			// temporary char
    int n;			// number of bytes currently being copied
    int file;

    if ((fsz = ftell(self->file)) > self->max_log_size) {

        fseek(self->file, fsz - self->max_log_size / 2, SEEK_SET);
        do {
            t = fgetc(self->file);
        } while (t != EOF && t != '\n' && t != '\r');
        // code for CR or LF
        while (t == '\n' || t == '\r') {
            t = fgetc(self->file);
        }
        left = fsz - (rd_pos = ftell(self->file) - 1);
        wr_pos = 0;
        fclose(self->file);
        if (t != EOF && left) {
            file = _open(self->filename, _O_BINARY | _O_RDWR, _S_IREAD | _S_IWRITE);
            if (file)
                do {
                    n = min(left, DEBUG_COPY_BUFFER_SIZE);
                    _lseek(file, rd_pos, SEEK_SET);
                    rd_pos += _read(file, tempbuffer, n);
                    _lseek(file, wr_pos, SEEK_SET);
                    wr_pos += _write(file, tempbuffer, n);
                    left -= n;
                } while (left);
                _chsize(file, wr_pos);
                _close(file);
        }
        self->file = fopen(self->filename, "a+t");
        fseek(self->file, wr_pos, SEEK_SET);
    }
}