/* CLI$DCL_PARSE to parse it using specified tables */ U_Long Cli_Parse_Command( const void *cmd_tables, const char *cmd_verb ) { struct { short len, code; void *adr; } fscn[2]; struct { char rqtype, rqindx, rqflags, rqstat; unsigned :32; Dsc rdesc; unsigned :32; unsigned :32; unsigned :32; } cmd; U_Long sts; int ltmp; char longbuf[8200]; (void)lib$establish(lib$sig_to_ret); memset(&cmd, 0, sizeof cmd); cmd.rqtype = CLI$K_GETCMD; /* command line minus the verb */ sts = sys$cli(&cmd, (void *)0, (void *)0); /* get actual command line */ if (vmswork(sts)) { /* ok => cli available & verb wasn't "RUN" */ /* invoked via symbol => have command line (which might be empty) */ /* [might also be invoked via mcr or dcl; that's ok] */ if (cmd.rqstat == CLI$K_VERB_MCR) { /* need to strip image name from MCR invocation */ memset(fscn, 0, sizeof fscn); fscn[0].code = FSCN$_FILESPEC; /* full file specification */ (void)sys$filescan(&cmd.rdesc, fscn, (long *)0); cmd.rdesc.len -= fscn[0].len; /* shrink size */ cmd.rdesc.adr += fscn[0].len; /* advance ptr */ } /* prepend verb and then parse the command line */ strcat(strcpy(longbuf, cmd_verb), " "), ltmp = strlen(longbuf); if (cmd.rdesc.len + ltmp > sizeof longbuf) cmd.rdesc.len = sizeof longbuf - ltmp; strncpy(&longbuf[ltmp], cmd.rdesc.adr, cmd.rdesc.len); cmd.rdesc.len += ltmp, cmd.rdesc.adr = longbuf; sts = cli$dcl_parse(&cmd.rdesc, cmd_tables); } return sts; }
static PyObject * FileScanner_FileScan(PyObject *self, PyObject *args) { FILE *infile; char *DataPtr; PyFileObject *File; PyArrayObject *Array; double *(*P_array); double *(*Old_P_array); int i,j,k; //int ScanCount = 0; npy_intp ScanCount = 0; int BufferSize = BUFFERSIZE2; int OldBufferSize = 0; int StartOfBuffer = 0; int NumBuffers = 0; if (!PyArg_ParseTuple(args, "O!", &PyFile_Type, &File) ) { return NULL; } infile = PyFile_AsFile( (PyObject*)File ); P_array = (double**) calloc(BufferSize, sizeof(void*) ); while (1) { for (j=StartOfBuffer; j < BufferSize; j++){ P_array[j] = (double*) calloc(BUFFERSIZE1, sizeof(double)); NumBuffers++ ; i = filescan(infile, BUFFERSIZE1, P_array[j]); if (i) { ScanCount += i; //for (k=0; k<BUFFERSIZE1; k++){ // printf("%.14g\n", P_array[j][k]); //} } if (i == 0){ break; } } if (i == 0) { break; } // Need more memory OldBufferSize = BufferSize; BufferSize += BUFFERSIZE2; StartOfBuffer += BUFFERSIZE2; Old_P_array = P_array; P_array = (double**) calloc(BufferSize, sizeof(void*) ); for (j=0; j < OldBufferSize; j++){ P_array[j] = Old_P_array[j]; } free(Old_P_array); } // copy all the data to a PyArray Array = (PyArrayObject *) PyArray_SimpleNew(1, &ScanCount, PyArray_DOUBLE); i = 0; DataPtr = Array->data; for (j=0; j<BufferSize; j++){ for (k=0; k<BUFFERSIZE1; k++){ if (i >= ScanCount) { break; } *(double *)DataPtr = P_array[j][k]; DataPtr += Array->strides[0]; i++; } } //free all the memory for (j=0; j<NumBuffers; j++){ free(P_array[j]); } free(P_array); return PyArray_Return(Array); }