📄 rexxapi.c
字号:
/*********************************************************************** 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 + -