Scripting Dynamics
/* * Copyright (c) 2017 Miguel Pando * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #include
#include
#include
#define DLL_EXPORT __declspec(dllexport) #define bsize 1024 char fbuffer[bsize]; FILE *fps[10]; char *ptr; //********************************************************** int openfile(char *fname, char *mode) { //********************************************************** int i; FILE *fp; for (i=0; i<10; i++) { if(!fps[i]) break; } if (i>=10) { printf("Open Files Exceed Limit\n"); return -1; } if ((fp = fopen(fname, mode))==NULL) { return -1; } fps[i]=fp; return i; } //********************************************************** int closefile(int fn) { //********************************************************** FILE *fp; fp=fps[fn]; if (fp==NULL) return -1; fclose(fp); fps[fn]=NULL; } //********************************************************** char *getcd() { //********************************************************** return getcwd(fbuffer, bsize); } //********************************************************** char *getfile(char *fname) { //********************************************************** FILE *xfp; int xsize; char *xbuffer; if((xfp = fopen(fname, "rb"))==NULL) { return NULL; } fseek(xfp, 0, SEEK_END); xsize = ftell(xfp); rewind(xfp); xbuffer = (char *) malloc(xsize + 1); fread(xbuffer, xsize, 1, xfp); xbuffer[xsize] = '\0'; fclose(xfp); return xbuffer; } //********************************************************** int putfile(char *fname, char *z) { //********************************************************** FILE *fp; if((fp = fopen(fname, "wb"))==NULL) return -1; fwrite(z, strlen(z), 1, fp); fclose(fp); return 0; } //********************************************************** int createfile(char *fname, char *z) { //********************************************************** FILE *fp; fp = fopen(fname, "r"); if (fp) {fclose(fp); return -1;} //Error if file exists if((fp = fopen(fname, "wb"))==NULL) return -2; //Unable to create fwrite(z, strlen(z), 1, fp); fclose(fp); return 0; } //********************************************************** int readline(fn) { //********************************************************** int ln; FILE *fp; fp=fps[fn]; if (fp==NULL) {return -1;} if (fgets(fbuffer, bsize, fp)==NULL) return -2; ln=strlen(fbuffer); if (ln) fbuffer[ln-1] = '\0'; return ln; } //************************************************************* DLL_EXPORT char * _run(char *proc, int *e, int argn, char **argz) { //************************************************************* int i, n, fn; char *r; void *(__cdecl *vt[1])(int argc, char **argv); int f=atoi(argz[argn]); //CallBack vt[0]=f; //if (ptr) {free(ptr); ptr=NULL;} *e=0; if (strcmp(proc, "getfile")==0) { ptr=getfile(argz[0]); if (ptr==NULL) {*e=1; return "Unable To Get File";} *e=-1; /* Tell Call Program to Free ptr */ return ptr; } if (strcmp(proc, "readline")==0) { fn=atoi(argz[0]); if (fn<0 || fn>9) { *e=1; return "Illegal File Number"; } i=readline(fn); if (i==-1) {*e=1; return "File Not Opened";} if (i==-2) {*e=1; return "At End Of File";} return fbuffer; } if (strcmp(proc, "openfile")==0) { fn=openfile(argz[0], argz[1]); if (fn < 0) {*e=1; return "Error Open File";} sprintf(fbuffer, "%d", fn); return fbuffer; } if (strcmp(proc, "closefile")==0) { fn=atoi(argz[0]); if (fn<0 || fn>9) { *e=1; return "Illegal File Number"; } i=closefile(fn); if (i<0) {*e=1; return "File Not Opened";} return "OK"; } if (strcmp(proc, "getcd")==0) { r=getcd(); if (r==NULL) {*e=1; return "Unable To Get Current Directory";} //return fbuffer; return r; } if (strcmp(proc, "putfile")==0) { *e=1; if (argn<2) return "Missing Arguments"; i=putfile(argz[0], argz[1]); if (i==-1) return "Unable To Put"; *e=0; return "OK"; } if (strcmp(proc, "createfile")==0) { *e=1; if (argn<2) return "Missing Arguments"; i=putfile(argz[0], argz[1]); if (i==-1) return "File Exists"; if (i==-2) return "Unable To Create"; *e=0; return "OK"; } *e=1; sprintf(fbuffer, "%s", "Proc Not Found "); strcat(fbuffer, proc); return fbuffer; } //************************************************************* DLL_EXPORT char * run(int argc, char **argv, char **argname, int *e) { //************************************************************* int ee; char *s; //(char *proc, int *e, int argn, char **argz) ee=0; s = _run(argv[0], &ee, argc, &argv[1]); *e = ee; return s; }