示例#1
0
void
clear_all_marks(void)
{
	clear_marks(regular_marks, ARRAY_LEN(regular_marks));
	clear_marks(lspecial_marks, ARRAY_LEN(lspecial_marks));
	clear_marks(rspecial_marks, ARRAY_LEN(rspecial_marks));
}
示例#2
0
文件: io.c 项目: DavidKeaton/bvi
/* loads a file, returns the filesize */
off_t load(char *fname)
{
    int fd = -1;
    char *string;
    buf.st_size = 0L;
    if(fname != NULL) {
        /*
        sprintf(string, "\"%s\"", fname);
        msg(string);
        refresh();
        */
        if(stat(fname, &buf) == -1) {
            /* check for EOVERFLOW       75              */
            /* Value too large for defined data type     */
            /* means bvi is compiled without lfs support */
            if(errno == ENOENT) {
                filemode = NEW;
            } else {
                move(maxy, 0);
                endwin();
                perror(fname);
                exit(0);
            }
            /*
            } else if (S_ISDIR(buf.st_mode)) {
                filemode = DIRECTORY;
            */
        } else if(S_ISCHR(buf.st_mode)) {
            filemode = CHARACTER_SPECIAL;
        } else if(S_ISBLK(buf.st_mode)) {
            filemode = BLOCK_SPECIAL;
            if(!block_flag) {
                block_flag = 1;
                block_begin = 0;
                block_size = 1024;
                block_end = block_begin + block_size - 1;
            }
            if((fd = open(fname, O_RDONLY)) > 0) {
                P(P_RO) = TRUE;
                params[P_RO].flags |= P_CHANGED;
            } else {
                sysemsg(fname);
                filemode = ERROR;
            }
        } else if(S_ISREG(buf.st_mode) || S_ISDIR(buf.st_mode)) {
#if 0
            /* stat() call above will fail if file is too large */
            /* this size check will never fail                  */
            if((unsigned long long)buf.st_size > (unsigned long long)OFF_T_MAX) {
                move(maxy, 0);
                endwin();
                printf("File too large\n");
                exit(0);
            }
#endif
            if((fd = open(fname, O_RDONLY)) > 0) {
                if(S_ISREG(buf.st_mode)) {
                    filemode = REGULAR;
                } else {
                    filemode = DIRECTORY;
                }
                if(access(fname, W_OK)) {
                    P(P_RO) = TRUE;
                    params[P_RO].flags |= P_CHANGED;
                }
            } else {
                sysemsg(fname);
                filemode = ERROR;
            }
        }
    } else {
        filemode = NEW;
    }
    if(mem != NULL) {
        free(mem);
    }
    memsize = 1024;
    if(block_flag) {
        if(block_flag == BLOCK_BEGIN) {
            block_size = buf.st_size - block_begin;
        }
        memsize += block_size;
    } else if(filemode == REGULAR) {
        memsize += buf.st_size;
    }
    if((mem = (char *)malloc(memsize)) == NULL) {
        move(maxy, 0);
        endwin();
        printf("Out of memory\n");
        exit(0);
    }
    clear_marks();
    if(fname != NULL) {
        string = malloc((size_t)strlen(fname) + MAXCMD);
    } else {
        string = malloc(MAXCMD);
    }
    if(string == NULL) {
        emsg("Out of memory");
        return 0;
    }
    if(block_flag && ((filemode == REGULAR) || (filemode == BLOCK_SPECIAL))) {
        if(lseek(fd, block_begin, SEEK_SET) < 0) {
            sysemsg(fname);
            filemode = ERROR;
        } else {
            if((filesize = read(fd, mem, block_size)) == 0) {
                sprintf(string, "\"%s\" Empty file", fname);
                filemode = ERROR;
            } else {
                sprintf(string, "\"%s\" range %llu-%llu", fname,
                        (unsigned long long)block_begin,
                        (unsigned long long)(block_begin + filesize - 1));
                filemode = PARTIAL;
                block_read = filesize;
                P(P_OF) = block_begin;
                params[P_OF].flags |= P_CHANGED;
            }
            msg(string);
            refresh();
        }
    } else if((filemode == REGULAR) || (filemode == DIRECTORY)) {
        filesize = buf.st_size;
        if(read(fd, mem, filesize) != filesize) {
            sysemsg(fname);
            filemode = ERROR;
        }
    } else {
        filesize = 0L;
    }
    if(fd > 0) {
        close(fd);
    }
    if(fname != NULL) {
        switch(filemode) {
            case NEW:
                sprintf(string, "\"%s\" [New File]", fname);
                break;
            case REGULAR:
                sprintf(string, "\"%s\" %s%llu bytes", fname,
                        P(P_RO) ? "[Read only] " : "",
                        (unsigned long long)filesize);
                break;
            case DIRECTORY:
                sprintf(string, "\"%s\" Directory", fname);
                break;
            case CHARACTER_SPECIAL:
                sprintf(string, "\"%s\" Character special file", fname);
                break;
            case BLOCK_SPECIAL:
                sprintf(string, "\"%s\" Block special file", fname);
                break;
        }
        if(filemode != ERROR) {
            msg(string);
        }
    }
    pagepos = mem;
    maxpos = mem + filesize;
    loc = HEX;
    x = AnzAdd;
    y = 0;
    repaint();
    free(string);
    return(filesize);
}