📄 rexxapi.c
字号:
retstr->strlength = strlen(retstr->strptr); return VALID_ROUTINE;}/************************************************************************** Function: UZUnZip ** ** Syntax: call UZUnZip ** ** Return: Unzip return code **************************************************************************/ULONG UZUnZip(CHAR *name, ULONG numargs, RXSTRING args[], CHAR *queuename, RXSTRING *retstr){ char *argv[30]; char *scan; int argc=0; int idx; CONSTRUCTGLOBALS(); if (numargs < 1 || numargs > 2 || args[0].strlength > 255) { DESTROYGLOBALS(); return INVALID_ROUTINE; /* Invalid call to routine */ } /* initialize data area */ if (numargs == 2) SetOutputVarStem(__G__ args[1].strptr); scan = args[0].strptr; argv[argc++] = ""; /* D:\\SOURCECODE\\UNZIP51S\\UNZIP.COM"; */ while (*scan == ' ') scan++; argv[argc++] = scan; while ( (scan = strchr(scan,' ')) != NULL) { *scan++ = 0; while (*scan == ' ') scan++; argv[argc++] = scan; } if (*argv[argc-1] == 0) argc--; argv[argc] = 0; /* GRR: should resetMainFlags() be called in here somewhere? */ sprintf(retstr->strptr, "%d", unzip(__G__ argc, argv)); /* a.k.a. MAIN() */ if (numargs == 2) SetOutputVarLength(__G); retstr->strlength = strlen(retstr->strptr); return RexxReturn(__G__ 1,retstr);}int varmessage(__GPRO__ ZCONST uch *buf, ulg size){ if (size > 0) memcpy(G.os2.buffer+G.os2.putchar_idx,buf,size); G.os2.putchar_idx = TextSetNext(__G__ G.os2.buffer, size+G.os2.putchar_idx,0); return 0;}int varputchar(__GPRO__ int c){ G.os2.buffer[G.os2.putchar_idx++] = c; if (c == '\n') { G.os2.buffer[G.os2.putchar_idx] = 0; if (G.os2.output_var[0]) G.os2.putchar_idx = TextSetNext(__G__ G.os2.buffer, G.os2.putchar_idx,0); else { G.os2.buffer[--G.os2.putchar_idx] = 0; puts(G.os2.buffer); G.os2.putchar_idx = 0; } } return 1;}int SetOutputVarStem(__GPRO__ const char *name){ int len=strlen(name); G.redirect_text=1; G.os2.output_idx = 0; strcpy(G.os2.output_var, name); if (len) { strupr(G.os2.output_var); /* uppercase the name */ if (*(G.os2.output_var+len-1) != '.') { *(G.os2.output_var+len) = '.'; len++; *(G.os2.output_var+len) = 0; } WriteToVariable(__G__ G.os2.output_var,"",0); } G.os2.stem_len = len; return G.os2.stem_len;}int SetOutputVar(__GPRO__ const char *name){ int len=strlen(name); G.redirect_text=1; G.os2.output_idx = 0; strcpy(G.os2.output_var, name); strupr(G.os2.output_var); /* uppercase the name */ if (*(name+len-1) == '.') G.os2.stem_len = len; else G.os2.stem_len = 0; return G.os2.stem_len;}int SetOutputVarLength(__GPRO){ if (G.os2.stem_len > 0) { if (G.os2.putchar_idx) TextSetNext(__G__ G.os2.buffer,G.os2.putchar_idx,1); return PrintToSubVariable(__G__ 0,"%d",G.os2.output_idx); } return 0;}int PrintToVariable(__GPRO__ const char *name, const char *format,...){ va_list arg_ptr; int ret; va_start(arg_ptr, format); ret = _PrintToVariable(__G__ name, format, arg_ptr); va_end(arg_ptr); return ret;}int WriteToVariable(__GPRO__ const char *name, char *buffer, int len){ 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 = buffer; G.os2.request.shvvalue.strlength = len; G.os2.request.shvvaluelen = len; G.os2.request.shvcode = RXSHV_SET; G.os2.request.shvret = 0; switch (RexxVariablePool(&G.os2.request)) { case RXSHV_BADN: G.os2.rexx_error = INVALID_ROUTINE; break; case RXSHV_MEMFL: G.os2.rexx_mes = ERROR_NOMEM; break; case RXSHV_OK: return 0; } return INVALID_ROUTINE; /* error on non-zero */}int _PrintToVariable(__GPRO__ const char *name, const char *format, va_list arg_ptr){ int ret = vsprintf(G.os2.buffer, format, arg_ptr); WriteToVariable(__G__ name, G.os2.buffer, strlen(G.os2.buffer)); return ret;}int PrintToSubVariable(__GPRO__ int idx, const char *format, ...){ va_list arg_ptr; int ret; if (G.os2.stem_len == 0) return INVALID_ROUTINE; /* error on non-zero */ sprintf(G.os2.output_var+G.os2.stem_len,"%d",idx); va_start(arg_ptr, format); ret = _PrintToVariable(__G__ G.os2.output_var, format, arg_ptr); va_end(arg_ptr); return ret;}int WriteToNextVariable(__GPRO__ char *buffer, int len){ if (G.os2.stem_len > 0) { G.os2.output_idx++; sprintf(G.os2.output_var+G.os2.stem_len,"%d",G.os2.output_idx); } return WriteToVariable(__G__ G.os2.output_var, buffer, len);}int TextSetNext(__GPRO__ char *buffer, int len, int all){ char *scan = buffer, *next, *base=buffer; int remaining=len; int ret; while ((next = strchr(scan,'\n')) != NULL && remaining > 0) { if (next > scan && *(next-1) == 0xd) *(next-1) = 0; else *next = 0; if (WriteToNextVariable(__G__ scan,strlen(scan))) return 0; next++; remaining -= (next-scan); scan = next; } if (remaining > 0) if (all) { *(scan+remaining) = 0; WriteToNextVariable(__G__ scan,remaining); } else { memcpy(buffer,scan,remaining); return remaining; } return 0;}int finish_REXX_redirect(__GPRO){ char *scan, *ptr; int idx=0, first=1, offset; if (!G.redirect_size) return 0; switch(G.redirect_data) { case 1: break; case 2: TextSetNext(__G__ G.redirect_buffer, G.redirect_size, 1); SetOutputVarLength(__G); DosFreeMem(G.redirect_buffer); G.redirect_buffer = NULL; G.redirect_size = 0; break; case 3: WriteToNextVariable(__G__ G.filename, strlen(G.filename)); strcpy(G.os2.output_var+G.os2.stem_len, G.filename); WriteToVariable(__G__ G.os2.output_var, G.redirect_buffer, G.redirect_size); DosFreeMem(G.redirect_buffer); G.redirect_buffer = NULL; G.redirect_size = 0; break; case 4: if ((scan = strrchr(G.filename,'/')) != NULL) { idx = *scan; *scan = 0; strupr(G.filename); *scan = idx; } scan = G.os2.output_var+G.os2.stem_len; strcpy(scan,G.filename); while ((scan = strchr(scan,'/')) != NULL) *scan = '.'; WriteToVariable(__G__ G.os2.output_var, G.redirect_buffer, G.redirect_size); DosFreeMem(G.redirect_buffer); G.redirect_buffer = NULL; G.redirect_size = 0; strcpy(G.os2.getvar_buf, G.os2.output_var); do { if ((scan = strrchr(G.filename,'/')) == NULL) offset = 0; else offset = scan-G.filename+1; if (first || !GetVariable(__G__ G.os2.output_var)) { ptr = G.os2.getvar_buf+offset+G.os2.stem_len; *ptr = '0'; *(ptr+1) = 0; if (!GetVariable(__G__ G.os2.getvar_buf)) idx = 1; else idx = atoi(G.os2.buffer)+1; PrintToVariable(__G__ G.os2.getvar_buf,"%d",idx); sprintf(ptr,"%d",idx); if (!first) { PrintToVariable(__G__ G.os2.output_var,"%d",idx); idx = strlen(G.filename); *(G.filename+idx) = '/'; *(G.filename+idx+1) = 0; } WriteToVariable(__G__ G.os2.getvar_buf,G.filename+offset,strlen(G.filename+offset)); first=0; } if (offset) { *(G.os2.output_var+G.os2.stem_len+offset-1) = 0; *scan = 0; } } while (offset); break; } return 0;}#endif /* OS2DLL */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -