⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rexxapi.c

📁 完整的解压zip文件的源码。包含密码功能
💻 C
📖 第 1 页 / 共 3 页
字号:
/***********************************************************************   REXXAPI.C                                                         **                                                                     **   This program adds a ZIP engine directly to the REXX language.     **   The functions are:                                                **       UZDropFuncs         -- Makes all functions in this package    **                              unknown to REXX.                       **       UZLoadFuncs         -- Makes all functions in this package    **                              known to REXX so REXX programs may     **                              call them.                             **       UZFileTree          -- Searches for files matching a given    **                              filespec, including files in           **                              subdirectories.                        **       UZUnZip             -- Unzip command-line entry point.        **                              This is functionally equivalent to     **                              using Unzip as an external program.    **       UZUnZipToVar            -- Unzip one file to a variable       **       UZUnZipToStem       -- Unzip files to a variable array        **       UZVer               -- Returns the Unzip version number       **                                                                     ***********************************************************************//* Include files */#ifdef OS2DLL#define  INCL_DOS#define  INCL_DOSMEMMGR#include <string.h>#include <stdlib.h>#include <stdio.h>#include <stdarg.h>#define UNZIP_INTERNAL#include "../unzip.h"#include "../version.h"/*********************************************************************//*  Various definitions used by various functions.                   *//*********************************************************************/RexxFunctionHandler UZDropFuncs;RexxFunctionHandler UZLoadFuncs;RexxFunctionHandler UZFileTree;RexxFunctionHandler UZUnZip;RexxFunctionHandler UZUnZipToVar;RexxFunctionHandler UZUnZipToStem;RexxFunctionHandler UZVer;RexxFunctionHandler UZAPIVer;int SetOutputVar(__GPRO__ const char *name);int SetOutputVarStem(__GPRO__ const char *name);int SetOutputVarLength(__GPRO);int WriteToVariable(__GPRO__ const char *name, char *buffer, int len);int PrintToSubVariable(__GPRO__ int idx, const char *format,...);int PrintToVariable(__GPRO__ const char *name, const char *format,...);int _PrintToVariable(__GPRO__ const char *name, const char *format, va_list arg_ptr);int TextSetNext(__GPRO__ char *format, int len, int all);#define EZRXSTRING(r,p)  {(r).strptr=(PCH)p;(r).strlength=(ULONG)strlen((r).strptr);}/*********************************************************************//* RxFncTable                                                        *//*   Array of names of the UNZIPAPI functions.                       *//*   This list is used for registration and deregistration.          *//*********************************************************************/static PSZ  RxFncTable[] =   {      "UZDropFuncs",      "UZLoadFuncs",      "UZFileSearch",      "UZFileTree",      "UZUnZip",      "UZUnZipToVar",      "UZUnZipToStem",      "UZVer",   };/*********************************************************************//* Numeric Error Return Strings                                      *//*********************************************************************/#define  NO_UTIL_ERROR    "0"          /* No error whatsoever        */#define  ERROR_NOMEM      "2"          /* Insufficient memory        *//*********************************************************************//* Numeric Return calls                                              *//*********************************************************************/#define  INVALID_ROUTINE 40            /* Raise Rexx error           */#define  VALID_ROUTINE    0            /* Successful completion      *//*********************************************************************//* Some useful macros                                                *//*********************************************************************/#define BUILDRXSTRING(t, s) { \  strcpy((t)->strptr,(s));\  (t)->strlength = strlen((s)); \}/*********************************************************************//****************  UNZIPAPI Supporting Functions  ********************//****************  UNZIPAPI Supporting Functions  ********************//****************  UNZIPAPI Supporting Functions  ********************//*********************************************************************/int RexxReturn(__GPRO__ int nodefault, RXSTRING *retstr){  int ret = G.os2.rexx_error;  if (G.filenotfound)    G.os2.rexx_mes = "file not found";  if (*G.os2.rexx_mes != '0') {    if (retstr->strlength > 255) {      DosFreeMem(retstr->strptr);      retstr->strptr = NULL;    }  } else if (nodefault)    goto noBuild;  BUILDRXSTRING(retstr, G.os2.rexx_mes); noBuild:  DESTROYGLOBALS();  return ret;}/* Get a variable from REXX, return 0 if OK */int GetVariable(__GPRO__ const char *name){  G.os2.request.shvnext = NULL;  EZRXSTRING(G.os2.request.shvname, name);  G.os2.request.shvnamelen = G.os2.request.shvname.strlength;  G.os2.request.shvvalue.strptr = G.os2.buffer;  G.os2.request.shvvalue.strlength = IBUF_LEN;  G.os2.request.shvvaluelen = IBUF_LEN;  G.os2.request.shvcode = RXSHV_SYFET;  G.os2.request.shvret = 0;  switch (RexxVariablePool(&G.os2.request)) {  case RXSHV_MEMFL:    G.os2.rexx_mes = ERROR_NOMEM;    break;  case RXSHV_BADN:  case RXSHV_NEWV:    G.os2.request.shvvaluelen = 0;  case RXSHV_OK:    *(G.os2.buffer+G.os2.request.shvvaluelen) = 0;    return G.os2.request.shvvaluelen;  }  return 0;}/* Get REXX compound variable *//* Stem must exist in G.os2.getvar_buf w/ length in G.os2.getvar_len */int GetVariableIndex(__GPRO__ int index){  sprintf(G.os2.getvar_buf+G.os2.getvar_len,"%d",index);  return GetVariable(__G__ G.os2.getvar_buf);}/* Transfer REXX array to standard C string array *//* Returns number of elements *//* User is responsible for calling KillStringArray */int CompoundToStringArray(__GPRO__ char ***pointer, const char *name){  int count;  int total;  char **trav;  G.os2.getvar_len = strlen(name);  memcpy(G.os2.getvar_buf,name,G.os2.getvar_len+1);  if (*(G.os2.getvar_buf+G.os2.getvar_len-1) != '.')    *(G.os2.getvar_buf+G.os2.getvar_len++) = '.', *(G.os2.getvar_buf+G.os2.getvar_len) = 0;  if (GetVariableIndex(__G__ 0))    return 0;  total = atoi(G.os2.buffer);  *pointer = (char **)malloc((total+1)<<2);  trav = *pointer;  for (count = 1; count <= total; count++) {    GetVariableIndex(__G__ count);    trav[count-1] = (char *)malloc(strlen(G.os2.buffer)+1);    strcpy(trav[count-1],G.os2.buffer);  }  trav[count-1] = NULL;  return total;}/* Kill string array created by CompoundToStringArray */void KillStringArray(char **pointer){  char **trav=pointer;  while (*trav != NULL) {    free(*trav);    trav++;  }  free(pointer);}/************************************************************************** Function:  UZDropFuncs                                                 **                                                                        ** Syntax:    call UZDropFuncs                                            **                                                                        ** Return:    NO_UTIL_ERROR - Successful.                                 **************************************************************************/ULONG UZDropFuncs(CHAR *name, ULONG numargs, RXSTRING args[],                  CHAR *queuename, RXSTRING *retstr){  INT     entries;                     /* Num of entries             */  INT     j;                           /* Counter                    */  if (numargs != 0)                    /* no arguments for this      */    return INVALID_ROUTINE;            /* raise an error             */  retstr->strlength = 0;               /* return a null string result*/  entries = sizeof(RxFncTable)/sizeof(PSZ);  for (j = 0; j < entries; j++)    RexxDeregisterFunction(RxFncTable[j]);  return VALID_ROUTINE;                /* no error on call           */}/************************************************************************** Function:  UZFileTree                                                  **                                                                        ** Syntax:    call UZFileTree zipfile, stem[, include-filespec]           **                                [, exclude-filespec][, options]         **                                                                        ** Params:    zipfile  - Name of zip file to search.                      **            stem     - Name of stem var to store results in.            **            include  - Filespec to search for (may include * and ?).    **            exclude  - Filespec to exclude (may include * and ?).       **            options  - Either of the following:                         **                       'F' - Give file statistics.                      **                          Length Date Time Name                         **                       'Z' - Give zip statistics, too.                  **                          Length Method Size Ratio Date Time CRC-32 Name**                       Default is to return only filenames              **                                                                        ** Return:    NO_UTIL_ERROR   - Successful.                               **            ERROR_NOMEM     - Out of memory.                            **************************************************************************/ULONG UZFileTree(CHAR *name, ULONG numargs, RXSTRING args[],                 CHAR *queuename, RXSTRING *retstr){                                       /* validate arguments         */  char *incname[2];  char *excname[2];  CONSTRUCTGLOBALS();  if (numargs < 2 || numargs > 5 ||      !RXVALIDSTRING(args[0]) ||      !RXVALIDSTRING(args[1]) ||      args[0].strlength > 255) {    DESTROYGLOBALS();    return INVALID_ROUTINE;            /* Invalid call to routine    */  }                                       /* initialize data area       */  SetOutputVarStem(__G__ args[1].strptr);  G.wildzipfn = args[0].strptr;  G.process_all_files = TRUE;  uO.lflag = 1;  uO.zipinfo_mode = TRUE;  uO.C_flag = 1;  G.extract_flag = FALSE;  uO.qflag = 2;  if (numargs >= 3 &&                  /* check third option         */      !RXNULLSTRING(args[2]) &&      args[2].strlength > 0) {            /* a zero length string isn't */    if (!(G.filespecs = CompoundToStringArray(__G__ &G.pfnames,args[2].strptr))) {      G.pfnames = incname;      incname[0] = args[2].strptr;      incname[1] = NULL;      G.filespecs = 1;    }    G.process_all_files = FALSE;  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -