/* u4trans.c (c)Copyright Sequiter Software Inc., 1988-1996. All rights reserved. */ #include "d4all.h" #include "u4trans.h" #ifndef UNIX #ifdef __TURBOC__ #pragma hdrstop #endif #endif #ifdef S4UNIX char *ltoa( long lVal, char *ptr, int num) { c4ltoa45( lVal, ptr, (num>0?num-1:num+1) ) ; ptr[ (num>0? num:-num)-1] = '\0' ; return( ptr ) ; } #endif #ifdef S4UTILS #ifdef S4WINDOWS #ifdef S4DLL_BUILD #define WM_UTIL_STATUS (WM_USER + 1) #define WM_UTIL_CLOSE (WM_USER + 2) FILE *stdout, *stderr ; unsigned int messageType ; /* icon style for message box */ char *statusStringBlank = " "; char *statusStringMessg = "Processing log file: "; char *statusStringBckSp = "\r"; char *statusStringFormt = "%3d.%02d%%%%"; char *statusStringSpace = "100.00 "; void S4FUNCTION sendStatusMessage( int hWnd, int percentComp ) { SendMessage( hWnd, WM_UTIL_STATUS, percentComp, 0L ) ; return ; } void S4FUNCTION sendCloseMessage( int hWnd ) { SendMessage( hWnd, WM_UTIL_CLOSE, 0, 0L ) ; return ; } /**************************************************************************** **:: Function: getLogDatabases ** ***************************************************************************** ** ** Function: getLogDatabases() ** ****************************************************************************/ #ifdef S4WINDOWS int S4FUNCTION getLogDatabases( char *logFileName, int hWndListBox ) { /* database required for a file selection listbox */ static FIELD4INFO openFileName[] = { { "DBFNAME", 'C', 12, 0 }, { "DBFPATH", 'C', 100, 0 }, { "PATHLEN", 'N', 3, 0 }, { 0, 0, 0 , 0 }, } ; static TAG4INFO fileNameTags[] = { { "NAMETAG", "DBFNAME+DBFPATH", "", 0, 0 }, { 0, 0, 0 , 0, 0 }, }; HCURSOR hCursor ; DWORD dwIndex ; CODE4 c4 ; TRAN4 *t4 = 0 ; DATA4 *openFile ; FIELD4 *fldDbfName = 0, *fldDbfPath = 0, *fldPathLen = 0 ; char *outMess[4], *data = 0, *cNone = "(none)" ; char buf[13], tmpBuf[256], pathBuf[256], *pathPtr, *tmpPtr ; long logFileLen; int rc = 0, tmpRc, tmpRc2, i = 0 ; unsigned int pathLen ; hCursor = SetCursor( LoadCursor( (HINSTANCE)NULL, IDC_WAIT ) ) ; code4init(&c4); c4.lockAttempts = WAIT4EVER; if( logFileName != 0 ) { if( logFileName[0] != 0 ) { rc = code4logOpen( &c4, logFileName, "" ) ; code4tranStatusSet( &c4, r4off ) ; } else rc = -1 ; } else rc = -1 ; if( rc != 0 ) { outMess[0] = "Log File Error.\r\n" ; outMess[1] = "Ensure Log File <" ; outMess[2] = logFileName ; outMess[3] = "> is a backed up Log File.\r\n" ; util4out( &c4, stdout, outMess, 4 ) ; } if( rc == 0 ) rc = file4refresh( &c4.transFile.file ) ; if( rc == 0 ) logFileLen = file4len( &c4.transFile.file ) ; if( (rc == 0) && ( logFileLen > 0 ) ) { t4 = &c4.c4trans.trans ; openFile = d4createTemp( &c4, openFileName, fileNameTags ) ; if( openFile == 0 ) rc = -1 ; } if( rc == 0 ) { fldDbfName = d4field( openFile, "DBFNAME" ) ; fldDbfPath = d4field( openFile, "DBFPATH" ) ; fldPathLen = d4field( openFile, "PATHLEN" ) ; d4tagSelect( openFile, d4tag( openFile, "NAMETAG" ) ) ; for( rc = tran4top( t4 ) ; ; rc = tran4skip( t4, TRAN4FORWARDS ) ) { if( rc != 0 ) break ; switch( tran4type(t4) ) { case TRAN4OPEN : data = tran4getData( t4, 0L ) ; if( data == 0 ) { rc = -1 ; break ; } rc = d4appendStart( openFile, 0 ) ; if( rc != 0 ) break ; memset( buf, 0, sizeof( buf ) ) ; memset( tmpBuf, 0, sizeof( tmpBuf ) ) ; memset( pathBuf, 0, sizeof( pathBuf ) ) ; memcpy( tmpBuf, data+2, *(short *)data ) ; u4namePiece( buf, sizeof( buf ), tmpBuf, 0, 1 ) ; u4namePiece( pathBuf, sizeof(pathBuf), tmpBuf, 1, 1 ) ; pathBuf[(strlen(pathBuf)-strlen(buf))] = 0 ; f4assign( fldDbfName, buf ) ; f4assign( fldDbfPath, pathBuf ) ; f4assignInt( fldPathLen, (int)strlen(pathBuf) ) ; rc = d4append( openFile ) ; break ; } } if( rc == r4eof ) rc = 0 ; } if( rc == 0 ) { for( rc = d4top( openFile ); rc == 0 ; rc = d4skip( openFile, 1L ) ) { dwIndex = SendMessage( hWndListBox, LB_ADDSTRING, 0, (LPARAM) f4str( fldDbfName ) ) ; tmpPtr = f4str( fldDbfPath ) ; pathLen = (unsigned int)f4int( fldPathLen ) ; pathPtr = (char *)u4allocDefault( (long)(pathLen+1) ) ; u4ncpy( pathPtr, tmpPtr, pathLen+1 ) ; SendMessage( hWndListBox, LB_SETITEMDATA, (WPARAM)dwIndex, (LPARAM) pathPtr ) ; } if( d4recCount( openFile ) == 0 ) SendMessage( hWndListBox, LB_ADDSTRING, 0, (LPARAM) cNone ) ; } SetCursor( hCursor ) ; tmpRc = rc ; tmpRc2 = c4.errorCode ; rc = code4close( &c4 ) ; code4transInitUndo( &c4.c4trans ) ; code4initUndo(&c4); if( rc < 0 || tmpRc < 0 || tmpRc2 != 0 ) return -1 ; else return rc ; } #endif /* S4WINDOWS */ #ifdef S4VBASIC long S4FUNCTION ReturnCPtr( LPSTR string ) { return (long)string ; } #endif /* S4VBASIC */ #endif /* S4DLL_BUILD */ #endif /* S4WINDOWS */ void util4out(CODE4 *c4, FILE *stream, char *str[], int numStr) { int i; #ifndef S4WINDOWS for (i=0; i 0 ) { messageExists = 1 ; if( (totalLen+messageLen) < sizeof(buf)-1 ) { lstrcpy( (bufptr+totalLen), str[i] ) ; totalLen += messageLen ; } messageLen = 0 ; } } if( messageExists ) MessageBox( (HWND)NULL, buf, "CodeUtility Message", messageType ) ; #endif #endif } void util4printCommandLine(CODE4 *c4, UTIL4FLAG u4[], int numFlags, char *programName) { int i; char **commandLine, programExe[41], *spaces; if (programName == 0) return; u4namePiece(programExe, 41, programName, 0, 1); #ifndef S4UNIX c4lower(programExe); #endif spaces =(char *) u4allocFree(c4, strlen(programExe)+2); if (spaces == 0) return; spaces[strlen(programExe)+1] = 0; memset(spaces, ' ', strlen(programExe)+1); commandLine = (char **)u4allocFree(c4, (2*numFlags+2)*4); if (commandLine == 0) { u4free(spaces); return; } commandLine[0] = programExe; commandLine[1] = " [@]\r\n"; for (i=0; i strlen(argv[j]+1)) continue; if (u4[i].caseSens) { if (strncmp(u4[i].name, argv[j]+1, strlen(argv[j]+1)) != 0) /* not this switch */ continue; } else { if (strnicmp(u4[i].name, argv[j]+1, strlen(argv[j]+1)) != 0) /* not this switch */ continue; } found = 1; if (u4[i].found != 0) { if (u4[i].multiples == 0) /* discard multiples */ break; if (u4[i].multiples == -1) { outMess[0] = "Command line error! Flag found more than once: "; outMess[1] = argv[j]; util4out(c4, stdout, outMess, 3); return(-1); } if (u4[i].multiples == 1 && u4[i].values != 0) { for (; u4[i].numPtr>0; u4[i].numPtr-=4) u4free(u4[i].ptr[u4[i].numPtr/4-1]); u4free(u4[i].ptr); } } if (u4[i].values == 0) { if (u4[i].ptr == 0) { u4[i].ptr = (char **)u4allocFree(c4, 4); if (u4[i].ptr == 0) return(-1); u4[i].ptr[0] = (char *)u4allocFree(c4, 1); if (u4[i].ptr[0] == 0) return(-1); u4[i].numPtr = 4; } *u4[i].ptr[0] = 1; u4[i].found = 1; continue; } count = u4[i].values > 0 ? u4[i].values : -u4[i].values; flag = j; while (count > 0 && j+1 < argc && *argv[j+1] != '-' && *argv[j+1] != '/') { j++; if (u4[i].ptr == 0) { u4[i].ptr = (char **)u4allocFree(c4, 4); if (u4[i].ptr == 0) return(-1); if (u4[i].multiples == 2 && !u4[i].exact) { u4[i].ptr[0] = (char *)u4allocFree(c4, strlen(argv[j])+2); if (u4[i].ptr[0] == 0) return(-1); *u4[i].ptr[0] = index = 1; strcpy(u4[i].ptr[0]+1, argv[j]); } else { u4[i].ptr[0] = (char *)u4allocFree(c4, strlen(argv[j])+1); if (u4[i].ptr[0] == 0) return(-1); strcpy(u4[i].ptr[0], argv[j]); } u4[i].numPtr = 4; } else if (u4[i].multiples == 1 && count == u4[i].values) /* replace */ { for (; u4[i].numPtr>0; u4[i].numPtr-=4) u4free(u4[i].ptr[u4[i].numPtr/4-1]); u4[i].ptr[0] = (char *)u4allocFree(c4, strlen(argv[j])+1); if (u4[i].ptr[0] == 0) return(-1); u4[i].numPtr = 4; strcpy(u4[i].ptr[0], argv[j]); } else /* add */ { if (count == u4[i].values) index = *u4[i].ptr[u4[i].numPtr/4-1] + 1; if (u4allocAgain(c4, (char **)&u4[i].ptr, &u4[i].numPtr, u4[i].numPtr+4) == e4memory) return(-1); u4[i].numPtr -= 4; if (u4[i].multiples == 2 && !u4[i].exact) { u4[i].ptr[u4[i].numPtr/4] = (char *)u4allocFree(c4, strlen(argv[j])+2); if (u4[i].ptr[u4[i].numPtr/4] == 0) return(-1); *u4[i].ptr[u4[i].numPtr/4] = index; strcpy(u4[i].ptr[u4[i].numPtr/4]+1, argv[j]); } else { u4[i].ptr[u4[i].numPtr/4] = (char *)u4allocFree(c4, strlen(argv[j])+1); if (u4[i].ptr[u4[i].numPtr/4] == 0) return(-1); strcpy(u4[i].ptr[u4[i].numPtr/4], argv[j]); } u4[i].numPtr += 4; } count--; } if ((u4[i].exact && count > 0) || (count == u4[i].values)) { outMess[0] = "Command line error! Not enough values for flag: "; outMess[1] = argv[flag]; util4out(c4, stdout, outMess, 3); return(-1); } u4[i].found = 1; } if (!found) { outMess[0] = "Command line error! Unknown flag: "; outMess[1] = argv[j]; util4out(c4, stdout, outMess, 3); return(-1); } } return(0); } void util4flagsFree(UTIL4FLAG u4[], int numFlags) { int i ; for (i=0; i0; u4[i].numPtr-=4) u4free(u4[i].ptr[u4[i].numPtr/4-1]); u4free(u4[i].ptr); } } int util4parseCommandLine(CODE4 *c4, UTIL4FLAG u4[], int numFlags, char* argv[], int argc) { int rc, quotes, inArg, j; unsigned int i, lenRead, buffSize ; long len, offset=0; char *buff; char **argvParse; int argcParse; FILE4 f4; if ((*argv[1] == '-' || *argv[1] == '/') && *(argv[1]+1) == '?') return(-1); if (*argv[1] == '@') { rc = file4open(&f4, c4, argv[1]+1, 0); if (rc != 0) return(rc); len = file4len(&f4); if (len < 0) { file4close(&f4); return((int) len); } if (len >= 65001) { buff = (char *)u4allocFree(c4, 65001); buffSize = 65000; } else { buff = (char *)u4allocFree(c4, len+1); buffSize = (unsigned int)len; } if (buff == 0) { file4close(&f4); return(-1); } while (len-offset > 0) { lenRead = file4read(&f4, offset, buff, buffSize); if (lenRead == 0) { rc = -1; break; } quotes = 0; inArg = 0; argcParse = 0; for (i=0; i 0 && buff[i-1] != '\\') quotes = 0; if (buff[i] < 32 || buff[i] == 127) { buff[i] = 0; inArg = 0; } if (!quotes && buff[i] == ' ') { buff[i] = 0; inArg = 0; } if (!inArg && buff[i] > 32) { inArg = 1; argcParse++; } } if (inArg) argcParse--; if (argcParse < 1) break; argvParse = (char **)u4allocFree(c4, 4*(argcParse+1)); if (argvParse == 0) { rc = -1; break; } i = 0; for (j=0; j len) return str; while (i > -1) str[len--] = str[i--]; while (len > -1) str[len--] = ' '; return str; } int util4checkOnOffCommandLine(CODE4 *c4, UTIL4FLAG u4[], int flag, int def) { char *outMess[5]; if (u4[flag].ptr == 0) return(def); c4upper( u4[flag].ptr[0] ) ; if (strcmp(u4[flag].ptr[0], "OFF") == 0) return(0); if (strcmp(u4[flag].ptr[0], "ON") == 0) return(1); outMess[0] = "Command line error! -"; outMess[1] = u4[flag].name; outMess[2] = " value "; outMess[3] = u4[flag].ptr[0]; outMess[4] = " is not ON or OFF.\r\n"; util4out(c4, stdout, outMess, 5); return(-1); } long util4checkRangeCommandLine(CODE4 *c4, UTIL4FLAG u4[], int flag, long def, long lRange, long hRange) { char *outMess[9]; char tempLow[12], tempHigh[12]; long temp; if (u4[flag].ptr == 0) return(def); temp = atol(u4[flag].ptr[0]); if (hRange - lRange < 0) return(temp); if (temp > hRange || temp < lRange) { outMess[0] = "Command line error! -"; outMess[1] = u4[flag].name; outMess[2] = " value "; outMess[3] = u4[flag].ptr[0]; outMess[4] = " is out of range "; outMess[5] = ltoa(lRange, tempLow, 10); outMess[6] = " to "; outMess[7] = ltoa(hRange, tempHigh, 10); outMess[8] = ".\r\n"; util4out(c4, stdout, outMess, 9); return(lRange-1); } return(temp); } #ifndef S4OFF_TRAN #ifndef S4OFF_COMMUNICATIONS int tran4serverEof( TRAN4 *trans, unsigned long *tranFileEof ) { CONNECTION4 *connection ; int rc ; CONNECTION4TRAN_EOF_INFO_OUT *out ; #ifdef E4PARM_LOW if ( trans == 0 || tranFileEof == 0 ) return e4parm_null ; #endif if ( trans->c4trans->c4->defaultServer == 0 ) return r4noServer ; connection = trans->c4trans->c4->defaultServer->connect ; #ifdef E4ANALYZE if ( connection == 0 ) return e4struct ; #endif connection4assign( connection, CON4TRAN_EOF, 0l, 0l ) ; connection4send( connection ) ; rc = connection4receive( connection ) ; if ( rc < 0 ) return rc ; rc = connection4status( connection ) ; if ( rc < 0 ) return rc ; if ( connection4len( connection ) != sizeof( CONNECTION4TRAN_EOF_INFO_OUT ) ) return e4packetLen ; out = (CONNECTION4TRAN_EOF_INFO_OUT *)connection4data( connection ) ; *tranFileEof = out->eof ; return 0 ; } int tran4serverEofHalt( TRAN4 *trans, unsigned long *tranFileEof ) { CONNECTION4 *connection ; int rc ; CONNECTION4TRAN_EOF_HALT_INFO_OUT *out ; #ifdef E4PARM_LOW if ( trans == 0 || tranFileEof == 0 ) return e4parm_null ; #endif if ( trans->c4trans->c4->defaultServer == 0 ) return r4noServer ; connection = trans->c4trans->c4->defaultServer->connect ; #ifdef E4ANALYZE if ( connection == 0 ) return e4struct ; #endif connection4assign( connection, CON4TRAN_EOF_HALT, 0l, 0l ) ; connection4send( connection ) ; rc = connection4receive( connection ) ; if ( rc < 0 ) return rc ; rc = connection4status( connection ) ; if ( rc < 0 ) return rc ; if ( connection4len( connection ) != sizeof( CONNECTION4TRAN_EOF_HALT_INFO_OUT ) ) return e4packetLen ; out = (CONNECTION4TRAN_EOF_HALT_INFO_OUT *)connection4data( connection ) ; *tranFileEof = out->eof ; return 0 ; } #endif /* S4OFF_COMMUNICATIONS */ #endif /* S4OFF_TRAN */ #endif /* S4UTILS */