/* * readf() * * returns zero if cannot get reference and hit end of-file * returns 1 if last reference in file, 2 if reference within file */ int bibtexin_readf( FILE *fp, char *buf, int bufsize, int *bufpos, newstr *line, newstr *reference, int *fcharset ) { int haveref = 0; char *p; *fcharset = CHARSET_UNKNOWN; while ( haveref!=2 && readmore( fp, buf, bufsize, bufpos, line ) ) { if ( line->len == 0 ) continue; /* blank line */ p = &(line->data[0]); /* Recognize UTF8 BOM */ if ( line->len > 2 && (unsigned char)(p[0])==0xEF && (unsigned char)(p[1])==0xBB && (unsigned char)(p[2])==0xBF ) { *fcharset = CHARSET_UNICODE; p += 3; } p = skip_ws( p ); if ( *p == '%' ) { /* commented out line */ newstr_empty( line ); continue; } if ( *p == '@' ) haveref++; if ( haveref && haveref<2 ) { newstr_strcat( reference, p ); newstr_addchar( reference, '\n' ); newstr_empty( line ); } else if ( !haveref ) newstr_empty( line ); } return haveref; }
int copacin_readf( FILE *fp, char *buf, int bufsize, int *bufpos, newstr *line, newstr *reference, int *fcharset ) { int haveref = 0, inref=0; char *p; while ( !haveref && readmore( fp, buf, bufsize, bufpos, line ) ) { /* blank line separates */ if ( line->data==NULL ) continue; if ( inref && line->len==0 ) haveref=1; p = &(line->data[0]); if ( copacin_istag( p ) ) { if ( inref ) newstr_addchar( reference, '\n' ); newstr_strcat( reference, p ); newstr_empty( line ); inref = 1; } else if ( inref ) { if ( p ) { /* copac puts tag only on 1st line */ newstr_addchar( reference, ' ' ); if ( *p ) p++; if ( *p ) p++; if ( *p ) p++; newstr_strcat( reference, p ); } newstr_empty( line ); } else { newstr_empty( line ); } } *fcharset = CHARSET_UNKNOWN; return haveref; }
static int risin_readf( FILE *fp, char *buf, int bufsize, int *bufpos, newstr *line, newstr *reference, int *fcharset ) { int haveref = 0, inref = 0, readtoofar = 0; unsigned char *up; char *p; *fcharset = CHARSET_UNKNOWN; while ( !haveref && readmore( fp, buf, bufsize, bufpos, line ) ) { if ( !line->data || line->len==0 ) continue; p = &( line->data[0] ); /* Recognize UTF8 BOM */ up = (unsigned char * ) p; if ( line->len > 2 && up[0]==0xEF && up[1]==0xBB && up[2]==0xBF ) { *fcharset = CHARSET_UNICODE; p += 3; } /* Each reference starts with 'TY - ' && * ends with 'ER - ' */ if ( strncmp(p,"TY - ",6)==0 ) { if ( !inref ) { inref = 1; } else { /* we've read too far.... */ readtoofar = 1; inref = 0; } } if ( risin_istag( p ) ) { if ( !inref ) { fprintf(stderr,"Warning. Tagged line not " "in properly started reference.\n"); fprintf(stderr,"Ignored: '%s'\n", p ); } else if ( !strncmp(p,"ER -",5) ) { inref = 0; } else { newstr_addchar( reference, '\n' ); newstr_strcat( reference, p ); } } /* not a tag, but we'll append to last values ...*/ else if ( inref && strncmp(p,"ER -",5)) { newstr_addchar( reference, '\n' ); newstr_strcat( reference, p ); } if ( !inref && reference->len ) haveref = 1; if ( !readtoofar ) newstr_empty( line ); } if ( inref ) haveref = 1; return haveref; }
void chanfd::rcb (int fdn) { rex_payload data; data.channel = channo; data.fd = fdn; char buf[16*1024]; bool fdrecved = false; size_t numbytes = 0; ssize_t n = fdi[fdn].isunixsocket ? readfd (fdn, buf, sizeof (buf), fdrecved): readmore (fdi[fdn].fd, buf, sizeof (buf), numbytes); if (fdi[fdn].isunixsocket && n >= 0) numbytes = n; // warn << "isunixsocket = " << (fdi[fdn].isunixsocket ? "YES" : "NO") // << "; numbytes = " << numbytes << "\n"; if (numbytes > 0) { data.data.set (buf, numbytes); fdi[fdn].rsize += numbytes; if (fdi[fdn].rsize >= hiwat) disablercb (fdn); ref<bool> okp (New refcounted<bool> (false)); c->call (REXCB_DATA, &data, okp, wrap (this, &chanfd::ccb, fdn, numbytes, destroyed, okp)); } if (n < 0 && errno == EAGAIN) return; if (n <= 0) { if (fdrecved) return; if (n < 0) warn ("chanfd::rcb:read(%d), rexfd:%d: %m\n", fdi[fdn].fd, fdn); data.data.clear (); fdi[fdn].reof = true; disablercb (fdn); c->call (REXCB_DATA, &data, &garbage_bool, aclnt_cb_null); } }
int isiin_readf( FILE *fp, char *buf, int bufsize, int *bufpos, newstr *line, newstr *reference, int *fcharset ) { int haveref = 0, inref = 0; char *p; while ( !haveref && readmore( fp, buf, bufsize, bufpos, line ) ) { if ( !line->data ) continue; p = &(line->data[0]); /* Each reference ends with 'ER ' */ if ( isiin_istag( p ) ) { if ( !strncmp( p, "FN ", 3 ) ) { if (strncasecmp( p, "FN ISI Export Format",20)){ fprintf( stderr, ": warning file FN type not '%s' not recognized.\n", /*r->progname,*/ p ); } } else if ( !strncmp( p, "VR ", 3 ) ) { if ( strncasecmp( p, "VR 1.0", 6 ) ) { fprintf(stderr,": warning file version number '%s' not recognized, expected 'VR 1.0'\n", /*r->progname,*/ p ); } } else if ( !strncmp( p, "ER", 2 ) ) haveref = 1; else { newstr_addchar( reference, '\n' ); newstr_strcat( reference, p ); inref = 1; } newstr_empty( line ); } /* not a tag, but we'll append to the last values */ else if ( inref ) { newstr_addchar( reference, '\n' ); newstr_strcat( reference, p ); newstr_empty( line ); } else { newstr_empty( line ); /* fprintf( stderr, "%s warning: '%s' outside of tag\n", r->progname, p ); */ } } *fcharset = CHARSET_UNKNOWN; return haveref; }
int copacin_readf( FILE *fp, char *buf, int bufsize, int *bufpos, newstr *line, newstr *reference, int *fcharset ) { int haveref = 0, inref=0; char *p; *fcharset = CHARSET_UNKNOWN; while ( !haveref && readmore( fp, buf, bufsize, bufpos, line ) ) { /* blank line separates */ if ( line->data==NULL ) continue; if ( inref && line->len==0 ) haveref=1; p = &(line->data[0]); /* Recognize UTF8 BOM */ if ( line->len > 2 && (unsigned char)(p[0])==0xEF && (unsigned char)(p[1])==0xBB && (unsigned char)(p[2])==0xBF ) { *fcharset = CHARSET_UNICODE; p += 3; } if ( copacin_istag( p ) ) { if ( inref ) newstr_addchar( reference, '\n' ); newstr_strcat( reference, p ); newstr_empty( line ); inref = 1; } else if ( inref ) { if ( p ) { /* copac puts tag only on 1st line */ newstr_addchar( reference, ' ' ); if ( *p ) p++; if ( *p ) p++; if ( *p ) p++; newstr_strcat( reference, p ); } newstr_empty( line ); } else { newstr_empty( line ); } } return haveref; }
int endin_readf( FILE *fp, char *buf, int bufsize, int *bufpos, newstr *line, newstr *reference, int *fcharset ) { int haveref = 0, inref = 0; unsigned char *up; char *p; *fcharset = CHARSET_UNKNOWN; while ( !haveref && readmore( fp, buf, bufsize, bufpos, line ) ) { if ( !line->data ) continue; p = &(line->data[0]); /* Skip <feff> Unicode header information */ /* <feff> = ef bb bf */ up = (unsigned char* ) p; if ( line->len > 2 && up[0]==0xEF && up[1]==0xBB && up[2]==0xBF ) { *fcharset = CHARSET_UNICODE; p += 3; } if ( !*p ) { if ( inref ) haveref = 1; /* blank line separates */ else continue; /* blank line to ignore */ } /* Each reference starts with a tag && ends with a blank line */ if ( endin_istag( p ) ) { if ( reference->len ) newstr_addchar( reference, '\n' ); newstr_strcat( reference, p ); inref = 1; } else if ( inref && p ) { newstr_addchar( reference, '\n' ); newstr_strcat( reference, p ); } newstr_empty( line ); } if ( reference->len ) haveref = 1; return haveref; }
/* * readf() * * returns zero if cannot get reference and hit end of-file * returns 1 if last reference in file, 2 if reference within file */ int bibtexin_readf( FILE *fp, char *buf, int bufsize, int *bufpos, newstr *line, newstr *reference, int *fcharset ) { int haveref = 0; char *p; while ( haveref!=2 && readmore( fp, buf, bufsize, bufpos, line ) ) { if ( line->len == 0 ) continue; /* blank line */ p = &(line->data[0]); p = skip_ws( p ); if ( *p == '%' ) { /* commented out line */ newstr_empty( line ); continue; } if ( *p == '@' ) haveref++; if ( haveref && haveref<2 ) { newstr_strcat( reference, p ); newstr_addchar( reference, '\n' ); newstr_empty( line ); } else if ( !haveref ) newstr_empty( line ); } *fcharset = CHARSET_UNKNOWN; return haveref; }
/* * Read and parse the response from the printer. Return 1 * if the request was successful, and 0 otherwise. * * LOCKING: none. */ int printer_status(int sfd, struct job *jp) { int i, success, code, len, found, bufsz, datsz; int32_t jobid; ssize_t nr; char *bp, *cp, *statcode, *reason, *contentlen; struct ipp_hdr *hp; /* * Read the HTTP header followed by the IPP response header. * They can be returned in multiple read attempts. Use the * Content-Length specifier to determine how much to read. */ success = 0; bufsz = IOBUFSZ; if ((bp = malloc(IOBUFSZ)) == NULL) log_sys("printer_status: can't allocate read buffer"); while ((nr = tread(sfd, bp, bufsz, 5)) > 0) { /* * Find the status. Response starts with "HTTP/x.y" * so we can skip the first 8 characters. */ cp = bp + 8; datsz = nr; while (isspace((int)*cp)) cp++; statcode = cp; while (isdigit((int)*cp)) cp++; if (cp == statcode) { /* Bad format; log it and move on */ log_msg(bp); } else { *cp++ = '\0'; reason = cp; while (*cp != '\r' && *cp != '\n') cp++; *cp = '\0'; code = atoi(statcode); if (HTTP_INFO(code)) continue; if (!HTTP_SUCCESS(code)) { /* probable error: log it */ bp[datsz] = '\0'; log_msg("error: %s", reason); break; } /* * HTTP request was okay, but still need to check * IPP status. Search for the Content-Length. */ i = cp - bp; for (;;) { while (*cp != 'C' && *cp != 'c' && i < datsz) { cp++; i++; } if (i >= datsz) { /* get more header */ if ((nr = readmore(sfd, &bp, i, &bufsz)) < 0) { goto out; } else { cp = &bp[i]; datsz += nr; } } if (strncasecmp(cp, "Content-Length:", 15) == 0) { cp += 15; while (isspace((int)*cp)) cp++; contentlen = cp; while (isdigit((int)*cp)) cp++; *cp++ = '\0'; i = cp - bp; len = atoi(contentlen); break; } else { cp++; i++; } } if (i >= datsz) { /* get more header */ if ((nr = readmore(sfd, &bp, i, &bufsz)) < 0) { goto out; } else { cp = &bp[i]; datsz += nr; } } found = 0; while (!found) { /* look for end of HTTP header */ while (i < datsz - 2) { if (*cp == '\n' && *(cp + 1) == '\r' && *(cp + 2) == '\n') { found = 1; cp += 3; i += 3; break; } cp++; i++; } if (i >= datsz) { /* get more header */ if ((nr = readmore(sfd, &bp, i, &bufsz)) < 0) { goto out; } else { cp = &bp[i]; datsz += nr; } } } if (datsz - i < len) { /* get more header */ if ((nr = readmore(sfd, &bp, i, &bufsz)) < 0) { goto out; } else { cp = &bp[i]; datsz += nr; } } hp = (struct ipp_hdr *)cp; i = ntohs(hp->status); jobid = ntohl(hp->request_id); if (jobid != jp->jobid) { /* * Different jobs. Ignore it. */ log_msg("jobid %d status code %d", jobid, i); break; } if (STATCLASS_OK(i)) success = 1; break; } } out: free(bp); if (nr < 0) { log_msg("jobid %d: error reading printer response: %s", jobid, strerror(errno)); } return(success); }
void browse(const char *ipath, const char *ifilter) { int r, fd; regex_t re; char *newpath; struct stat sb; char *name, *bin, *dir, *tmp, *run, *env; int nowtyping = 0; FILE *fp; oldpath = NULL; path = xstrdup(ipath); fltr = xstrdup(ifilter); begin: /* Path and filter should be malloc(3)-ed strings at all times */ r = populate(); if (r == -1) { if (!nowtyping) { printwarn(); goto nochange; } } for (;;) { redraw(); /* Handle filter-as-you-type mode */ if (nowtyping) goto moretyping; nochange: switch (nextsel(&run, &env)) { case SEL_QUIT: free(path); free(fltr); dentfree(dents, n); return; case SEL_BACK: /* There is no going back */ if (strcmp(path, "/") == 0 || strcmp(path, ".") == 0 || strchr(path, '/') == NULL) goto nochange; dir = xdirname(path); if (canopendir(dir) == 0) { free(dir); printwarn(); goto nochange; } /* Save history */ oldpath = path; path = dir; /* Reset filter */ free(fltr); fltr = xstrdup(ifilter); goto begin; case SEL_GOIN: /* Cannot descend in empty directories */ if (n == 0) goto nochange; name = dents[cur].name; newpath = mkpath(path, name); DPRINTF_S(newpath); /* Get path info */ fd = open(newpath, O_RDONLY | O_NONBLOCK); if (fd == -1) { printwarn(); free(newpath); goto nochange; } r = fstat(fd, &sb); if (r == -1) { printwarn(); close(fd); free(newpath); goto nochange; } close(fd); DPRINTF_U(sb.st_mode); switch (sb.st_mode & S_IFMT) { case S_IFDIR: if (canopendir(newpath) == 0) { printwarn(); free(newpath); goto nochange; } free(path); path = newpath; /* Reset filter */ free(fltr); fltr = xstrdup(ifilter); goto begin; case S_IFREG: bin = openwith(newpath); if (bin == NULL) { printmsg("No association"); free(newpath); goto nochange; } exitcurses(); spawn(bin, newpath, NULL); initcurses(); free(newpath); continue; default: printmsg("Unsupported file"); goto nochange; } case SEL_FLTR: /* Read filter */ printprompt("filter: "); tmp = readln(); if (tmp == NULL) tmp = xstrdup(ifilter); /* Check and report regex errors */ r = setfilter(&re, tmp); if (r != 0) { free(tmp); goto nochange; } free(fltr); fltr = tmp; DPRINTF_S(fltr); /* Save current */ if (n > 0) oldpath = mkpath(path, dents[cur].name); goto begin; case SEL_TYPE: nowtyping = 1; tmp = NULL; moretyping: printprompt("type: "); if (tmp != NULL) printw("%s", tmp); r = readmore(&tmp); DPRINTF_D(r); DPRINTF_S(tmp); if (r == 1) nowtyping = 0; /* Check regex errors */ if (tmp != NULL) { r = setfilter(&re, tmp); if (r != 0) if (nowtyping) { goto moretyping; } else { free(tmp); goto nochange; } } /* Copy or reset filter */ free(fltr); if (tmp != NULL) fltr = xstrdup(tmp); else fltr = xstrdup(ifilter); /* Save current */ if (n > 0) oldpath = mkpath(path, dents[cur].name); if (!nowtyping) free(tmp); goto begin; case SEL_NEXT: if (cur < n - 1) cur++; break; case SEL_PREV: if (cur > 0) cur--; break; case SEL_PGDN: if (cur < n - 1) cur += MIN((LINES - 4) / 2, n - 1 - cur); break; case SEL_PGUP: if (cur > 0) cur -= MIN((LINES - 4) / 2, cur); break; case SEL_HOME: cur = 0; break; case SEL_END: cur = n - 1; break; case SEL_CD: /* Read target dir */ printprompt("chdir: "); tmp = readln(); if (tmp == NULL) { clearprompt(); goto nochange; } newpath = mkpath(path, tmp); free(tmp); if (canopendir(newpath) == 0) { free(newpath); printwarn(); goto nochange; } free(path); path = newpath; free(fltr); fltr = xstrdup(ifilter); /* Reset filter */ DPRINTF_S(path); goto begin; case SEL_MTIME: mtimeorder = !mtimeorder; /* Save current */ if (n > 0) oldpath = mkpath(path, dents[cur].name); goto begin; case SEL_REDRAW: /* Save current */ if (n > 0) oldpath = mkpath(path, dents[cur].name); goto begin; case SEL_RUN: run = xgetenv(env, run); exitcurses(); spawn(run, NULL, path); initcurses(); break; case SEL_RUNARG: name = dents[cur].name; run = xgetenv(env, run); exitcurses(); spawn(run, name, path); initcurses(); break; case SEL_PRINT: name = dents[cur].name; fp = fopen("savelist.txt", "a"); fprintf(fp, "%s/%s\n", path, name); fclose(fp); break; } /* Screensaver */ if (idletimeout != 0 && idle == idletimeout) { idle = 0; exitcurses(); spawn(idlecmd, NULL, NULL); initcurses(); } } }