📄 api.c
字号:
G.pxnames = cpExclude, G.process_all_files = FALSE; } G.processExternally = callBack; r = process_zipfiles(__G)==0; DESTROYGLOBALS(); return r;}#endif /* OS2DLL */#endif /* !SFX *//*--------------------------------------------------------------------------- Helper functions ---------------------------------------------------------------------------*/void setFileNotFound(__G) __GDEF{ G.filenotfound++;}#ifndef SFXint unzipToMemory(__GPRO__ char *zip, char *file, UzpBuffer *retstr){ int r; char *incname[2]; G.process_all_files = FALSE; G.extract_flag = TRUE; uO.qflag = 2; G.wildzipfn = zip; G.pfnames = incname; incname[0] = file; incname[1] = NULL; G.filespecs = 1; r = process_zipfiles(__G); if (retstr) { retstr->strptr = (char *)G.redirect_buffer; retstr->strlength = G.redirect_size; } return r; /* returns `PK_???' error values */}#endif /* !SFX */int redirect_outfile(__G) __GDEF{ if (G.redirect_size != 0 || G.redirect_buffer != NULL) return FALSE;#ifndef NO_SLIDE_REDIR G.redirect_slide = !G.pInfo->textmode;#endif#if (lenEOL != 1) if (G.pInfo->textmode) { G.redirect_size = G.lrec.ucsize * lenEOL; if (G.redirect_size < G.lrec.ucsize) G.redirect_size = ((G.lrec.ucsize > (ulg)-2L) ? G.lrec.ucsize : (ulg)-2L); } else#endif { G.redirect_size = G.lrec.ucsize; }#ifdef __16BIT__ if ((ulg)((extent)G.redirect_size) != G.redirect_size) return FALSE;#endif#ifdef OS2 DosAllocMem((void **)&G.redirect_buffer, G.redirect_size+1, PAG_READ|PAG_WRITE|PAG_COMMIT); G.redirect_pointer = G.redirect_buffer;#else G.redirect_pointer = G.redirect_buffer = malloc((extent)(G.redirect_size+1));#endif if (!G.redirect_buffer) return FALSE; G.redirect_pointer[G.redirect_size] = '\0'; return TRUE;}int writeToMemory(__GPRO__ ZCONST uch *rawbuf, extent size){ int errflg = FALSE; if ((uch *)rawbuf != G.redirect_pointer) { extent redir_avail = (G.redirect_buffer + G.redirect_size) - G.redirect_pointer; /* Check for output buffer overflow */ if (size > redir_avail) { /* limit transfer data to available space, set error return flag */ size = redir_avail; errflg = TRUE; } memcpy(G.redirect_pointer, rawbuf, size); } G.redirect_pointer += size; return errflg;}int close_redirect(__G) __GDEF{ if (G.pInfo->textmode) { *G.redirect_pointer = '\0'; G.redirect_size = (ulg)(G.redirect_pointer - G.redirect_buffer); if ((G.redirect_buffer = realloc(G.redirect_buffer, G.redirect_size + 1)) == NULL) { G.redirect_size = 0; return EOF; } } return 0;}#ifndef SFX#ifndef __16BIT__#ifndef WINDLL/* Purpose: Determine if file in archive contains the string szSearch Parameters: archive = archive name file = file contained in the archive. This cannot be a wild card to be meaningful pattern = string to search for cmd = 0 - case-insensitive search 1 - case-sensitve search 2 - case-insensitive, whole words only 3 - case-sensitive, whole words only SkipBin = if true, skip any files that have control characters other than CR, LF, or tab in the first 100 characters. Returns: TRUE if a match is found FALSE if no match is found -1 on error Comments: This does not pretend to be as useful as the standard Unix grep, which returns the strings associated with a particular pattern, nor does it search past the first matching occurrence of the pattern. */int UZ_EXP UzpGrep(char *archive, char *file, char *pattern, int cmd, int SkipBin, UzpCB *UsrFuncts){ int retcode = FALSE, compare; ulg i, j, patternLen, buflen; char * sz, *p; UzpOpts flgopts; UzpBuffer retstr; memzero(&flgopts, sizeof(UzpOpts)); /* no special options */ if (!UzpUnzipToMemory(archive, file, &flgopts, UsrFuncts, &retstr)) { return -1; /* not enough memory, file not found, or other error */ } if (SkipBin) { if (retstr.strlength < 100) buflen = retstr.strlength; else buflen = 100; for (i = 0; i < buflen; i++) { if (iscntrl(retstr.strptr[i])) { if ((retstr.strptr[i] != 0x0A) && (retstr.strptr[i] != 0x0D) && (retstr.strptr[i] != 0x09)) { /* OK, we now think we have a binary file of some sort */ free(retstr.strptr); return FALSE; } } } } patternLen = strlen(pattern); if (retstr.strlength < patternLen) { free(retstr.strptr); return FALSE; } sz = malloc(patternLen + 3); /* add two in case doing whole words only */ if (cmd > 1) { strcpy(sz, " "); strcat(sz, pattern); strcat(sz, " "); } else strcpy(sz, pattern); if ((cmd == 0) || (cmd == 2)) { for (i = 0; i < strlen(sz); i++) sz[i] = toupper(sz[i]); for (i = 0; i < retstr.strlength; i++) retstr.strptr[i] = toupper(retstr.strptr[i]); } for (i = 0; i < (retstr.strlength - patternLen); i++) { p = &retstr.strptr[i]; compare = TRUE; for (j = 0; j < patternLen; j++) { /* We cannot do strncmp here, as we may be dealing with a * "binary" file, such as a word processing file, or perhaps * even a true executable of some sort. */ if (p[j] != sz[j]) { compare = FALSE; break; } } if (compare == TRUE) { retcode = TRUE; break; } } free(sz); free(retstr.strptr); return retcode;}#endif /* !WINDLL */#endif /* !__16BIT__ */int UZ_EXP UzpValidate(char *archive, int AllCodes){ int retcode; CONSTRUCTGLOBALS(); uO.jflag = 1; uO.tflag = 1; uO.overwrite_none = 0; G.extract_flag = (!uO.zipinfo_mode && !uO.cflag && !uO.tflag && !uO.vflag && !uO.zflag#ifdef TIMESTAMP && !uO.T_flag#endif ); uO.qflag = 2; /* turn off all messages */ G.fValidate = TRUE; G.pfnames = (char **)&fnames[0]; /* assign default filename vector */#ifdef WINDLL Wiz_NoPrinting(TRUE);#endif if (archive == NULL) { /* something is screwed up: no filename */ DESTROYGLOBALS(); return PK_NOZIP; } G.wildzipfn = (char *)malloc(FILNAMSIZ + 1); strcpy(G.wildzipfn, archive);#if (defined(WINDLL) && !defined(CRTL_CP_IS_ISO)) _ISO_INTERN(G.wildzipfn);#endif G.process_all_files = TRUE; /* for speed */ retcode = setjmp(dll_error_return); if (retcode) {#ifdef WINDLL Wiz_NoPrinting(FALSE);#endif free(G.wildzipfn); DESTROYGLOBALS(); return PK_BADERR; } retcode = process_zipfiles(__G); free(G.wildzipfn);#ifdef WINDLL Wiz_NoPrinting(FALSE);#endif DESTROYGLOBALS(); /* PK_WARN == 1 and PK_FIND == 11. When we are just looking at an archive, we should still be able to see the files inside it, even if we can't decode them for some reason. We also still want to be able to get at files even if there is something odd about the zip archive, hence allow PK_WARN, PK_FIND, IZ_UNSUP as well as PK_ERR */ if (AllCodes) return retcode; if ((retcode == PK_OK) || (retcode == PK_WARN) || (retcode == PK_ERR) || (retcode == IZ_UNSUP) || (retcode == PK_FIND)) return TRUE; else return FALSE;}#endif /* !SFX */#endif /* DLL */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -