char * MDXData (const void *data, unsigned int len, char *buf) { MDX_CTX ctx; MDXInit(&ctx); MDXUpdate(&ctx,data,len); return (MDXEnd(&ctx, buf)); }
char * MDXFileChunk(const char *filename, char *buf, off_t ofs, off_t len) { unsigned char buffer[16*1024]; MDX_CTX ctx; struct stat stbuf; int fd, readrv, e; off_t remain; if (len < 0) { errno = EINVAL; return NULL; } MDXInit(&ctx); fd = open(filename, O_RDONLY); if (fd < 0) return NULL; if (ofs != 0) { errno = 0; if (lseek(fd, ofs, SEEK_SET) != ofs || (ofs == -1 && errno != 0)) { readrv = -1; goto error; } } remain = len; readrv = 0; while (len == 0 || remain > 0) { if (len == 0 || remain > sizeof(buffer)) readrv = read(fd, buffer, sizeof(buffer)); else readrv = read(fd, buffer, remain); if (readrv <= 0) break; MDXUpdate(&ctx, buffer, readrv); remain -= readrv; } error: e = errno; close(fd); errno = e; if (readrv < 0) return NULL; return (MDXEnd(&ctx, buf)); }
char * MDXFileChunk(const char *filename, char *buf, off_t ofs, off_t len) { unsigned char buffer[BUFSIZ]; MDX_CTX ctx; struct stat stbuf; int f, i, e; off_t n; MDXInit(&ctx); f = open(filename, O_RDONLY); if (f < 0) return 0; if (fstat(f, &stbuf) < 0) return 0; if (ofs > stbuf.st_size) ofs = stbuf.st_size; if ((len == 0) || (len > stbuf.st_size - ofs)) len = stbuf.st_size - ofs; if (lseek(f, ofs, SEEK_SET) < 0) return 0; n = len; i = 0; while (n > 0) { if (n > sizeof(buffer)) i = read(f, buffer, sizeof(buffer)); else i = read(f, buffer, n); if (i < 0) break; MDXUpdate(&ctx, buffer, i); n -= i; } e = errno; close(f); errno = e; if (i < 0) return 0; return (MDXEnd(&ctx, buf)); }