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)); }
/* 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); }