/* * initSource - initialize language variables */ static vi_rc initSource( vlist *vl, char *data ) { int j; char tmp[MAX_SRC_LINE], name[MAX_NUM_STR], all[MAX_SRC_LINE]; vi_rc rc; all[0] = 0; /* * break up command line parms */ j = 1; while( TRUE ) { rc = GetStringWithPossibleQuote( data, tmp ); if( rc != ERR_NO_ERR ) { break; } VarAddStr( itoa( j, name, 10 ), tmp, vl ); StrMerge( 2, all, tmp, SingleBlank ); j++; } VarAddStr( "*", all, vl ); return( ERR_NO_ERR ); } /* initSource */
/* * initSource - initialize language variables */ static vi_rc initSource( vlist *vl, char *data ) { int j; char tmp[MAX_SRC_LINE]; char name[MAX_NUM_STR]; char all[MAX_SRC_LINE]; /* * break up command line parms */ all[0] = 0; for( j = 1; GetStringWithPossibleQuote( data, tmp ) == ERR_NO_ERR; ++j ) { sprintf( name, "%d", j ); VarAddStr( name, tmp, vl ); StrMerge( 2, all, tmp, SingleBlank ); } VarAddStr( "*", all, vl ); return( ERR_NO_ERR ); } /* initSource */
/* * SrcAssign - assign a value to a variable */ vi_rc SrcAssign( const char *data, vlist *vl ) { int i, j, k, l; long val; bool rxflag = false; bool envflag = false; bool setflag = false; bool expflag = false; bool timeflag = false; bool lnumflag = false; char tmp[MAX_SRC_LINE], tmp1[MAX_SRC_LINE], name[MAX_SRC_LINE]; const char *v1; char *t; vars *v; jmp_buf jmpaddr; time_t tod; bool check_end; char tmpstr[MAX_STR]; /* * get assign syntax : * ASSIGN %v = /v1/(r)($)(@)(x)(l)(t) * possible v1: * strlen %a * strchr %a ch * substr %a n1 n2 */ data = GetNextWord1( data, tmp ); if( *tmp == '\0' ) { return( ERR_SRC_INVALID_ASSIGN ); } if( !VarName( name, tmp, vl ) ) { return( ERR_SRC_INVALID_ASSIGN ); } data = GetNextWord1( data, tmp ); if( *tmp == '\0' ) { return( ERR_SRC_INVALID_ASSIGN ); } if( stricmp( tmp, "=" ) != 0 ) { return( ERR_SRC_INVALID_ASSIGN ); } data = SkipLeadingSpaces( data ); if( data[0] == '/' || data[0] == '"' ) { check_end = false; if( data[0] == '"' ) { data = GetNextWord( data, tmp, SingleQuote ); if( data[0] == '"' ) { check_end = true; } } else { data = GetNextWord( data, tmp, SingleSlash ); if( data[0] == '/' ) { check_end = true; } } if( check_end ) { for( ++data; data[0] != '\0'; data++ ) { switch( data[0] ) { case 't': timeflag = true; break; case 'r': rxflag = true; break; case '$': envflag = true; break; case '@': setflag = true; break; case 'x': expflag = true; break; case 'l': lnumflag = true; break; } } } Expand( tmp1, tmp, vl ); } else { data = GetNextWord1( data, tmp ); if( *tmp == '\0' ) { return( ERR_SRC_INVALID_ASSIGN ); } j = Tokenize( StrTokens, tmp, false ); if( j != TOK_INVALID ) { data = GetNextWord1( data, tmp ); if( *tmp == '\0' ) { return( ERR_SRC_INVALID_ASSIGN ); } if( !VarName( tmp1, tmp, vl ) ) { return( ERR_SRC_INVALID_ASSIGN ); } v = VarFind( tmp1, vl ); switch( j ) { case STR_T_STRLEN: if( v != NULL ) { sprintf( tmp1, "%d", v->len ); } else { strcpy( tmp1, "0" ); } break; case STR_T_SUBSTR: data = GetNextWord1( data, tmp ); if( *tmp == '\0' ) { return( ERR_SRC_INVALID_ASSIGN ); } Expand( tmp1, tmp, vl ); i = atoi( tmp1 ) - 1; data = GetNextWord1( data, tmp ); if( *tmp == '\0' ) { return( ERR_SRC_INVALID_ASSIGN ); } Expand( tmp1, tmp, vl ); j = atoi( tmp1 ) - 1; if( v == NULL ) { tmp1[0] = '\0'; break; } if( j >= v->len || i < 0 ) { tmp1[0] = '\0'; } else { l = 0; for( k = i; k <= j; k++ ) { tmp1[l++] = v->value[k]; } tmp1[l] = '\0'; } break; case STR_T_STRCHR: data = GetNextWord1( data, tmp ); if( *tmp == '\0' ) { return( ERR_SRC_INVALID_ASSIGN ); } Expand( tmp1, tmp, vl ); if( v == NULL ) { j = -1; } else { t = strchr( v->value, tmp1[0] ); if( t != NULL ) { j = t - v->value; } else { j = -1; } j++; } sprintf( tmp1, "%d", j ); break; } } else { Expand( tmp1, tmp, vl ); } } /* * regular expression subs. */ if( rxflag && CurrentRegularExpression != NULL ) { RegSub( CurrentRegularExpression, tmp1, tmp, CurrentPos.line ); strcpy( tmp1, tmp ); } /* * special processing */ if( envflag ) { v1 = getenv( tmp1 ); if( v1 == NULL ) { v1 = ""; } } else if( setflag ) { v1 = GetASetVal( tmp1, tmpstr ); } else if( timeflag ) { tod = time( NULL ); strftime( tmp, sizeof( tmp ), tmp1, localtime( &tod ) ); v1 = tmp; } else if( expflag || lnumflag ) { i = setjmp( jmpaddr ); if( i != 0 ) { return( (vi_rc)i ); } StartExprParse( tmp1, jmpaddr ); val = GetConstExpr(); if( lnumflag ) { fcb *cfcb; line *cline; vi_rc rc; rc = CGimmeLinePtr( val, &cfcb, &cline ); v1 = cline->data; if( rc != ERR_NO_ERR ) { v1 = ""; } } else { v1 = ltoa( val, tmp1, EditVars.Radix ); } } else { v1 = tmp1; } VarAddStr( name, v1, vl ); return( ERR_NO_ERR ); } /* SrcAssign */
/* * RunDDECommand - try to run a Windows specific command */ bool RunDDECommand( int token, const char *str, char *tmp1, vi_rc *result, vlist *vl ) { vi_rc rc; char *tmp2; char *tmp3; HSZ hdl; HSZ serverhdl, topichdl; DWORD dword; HCONV hconv; HDDEDATA data; char *ptr; int len; jmp_buf jmpaddr; int jmprc; tmp2 = alloca( MAX_INPUT_LINE ); if( tmp2 == NULL ) { return( false ); } tmp3 = alloca( MAX_INPUT_LINE ); if( tmp3 == NULL ) { return( false ); } if( token == T_DDEINIT ) { if( !DDEInit() ) { *result = ERR_DDE_FAIL; } else { *result = ERR_NO_ERR; } return( true ); } if( !UseDDE ) { *result = ERR_INVALID_DDE; return( true ); } rc = ERR_NO_ERR; switch( token ) { case T_DDEQUERYSTRING: /* * syntax: ddequerystring <resvar> handle */ if( !getVarName( &str, tmp1, vl ) ) { rc = ERR_INVALID_DDE; break; } str = Expand( tmp3, str, vl ); if( !GetHSZ( &str, &hdl ) ) { rc = ERR_INVALID_DDE; break; } len = DdeQueryString( DDEInstId, hdl, NULL, 0, CP_WINANSI ) + 1; ptr = MemAlloc( len ); DdeQueryString( DDEInstId, hdl, ptr, len, CP_WINANSI ); VarAddStr( tmp1, ptr, vl ); MemFree( ptr ); break; case T_DDERET: /* * syntax: dderet retval */ str = Expand( tmp3, str, vl ); jmprc = setjmp( jmpaddr ); if( jmprc == 0 ) { StartExprParse( str, jmpaddr ); DDERet = (HDDEDATA)GetConstExpr(); } else { rc = ERR_INVALID_DDE; } break; case T_DDESERVER: /* * syntax: ddeserver <serverhandle> */ str = Expand( tmp3, str, vl ); if( !GetHSZ( &str, &hdl ) ) { rc = ERR_INVALID_DDE; } else { if( !DdeNameService( DDEInstId, hdl, (HSZ)NULL, DNS_REGISTER ) ) { rc = ERR_DDE_FAIL; } else { ServerCount++; } } break; case T_CREATEDDESTRING: /* * syntax: createddestring <handlevar> "<string>" */ if( !getVarName( &str, tmp1, vl ) ) { rc = ERR_INVALID_DDE; break; } if( GetStringWithPossibleQuote( &str, tmp2 ) != ERR_NO_ERR ) { rc = ERR_INVALID_DDE; break; } str = Expand( tmp3, tmp2, vl ); if( !CreateStringHandle( str, &hdl ) ) { rc = ERR_DDE_FAIL; } else { sprintf( tmp2, "%ld", (long)hdl ); VarAddStr( tmp1, tmp2, vl ); } break; case T_DELETEDDESTRING: /* * syntax: deleteddestring <handle> */ str = Expand( tmp3, str, vl ); if( !GetHSZ( &str, &hdl ) ) { rc = ERR_INVALID_DDE; } else { DeleteStringHandle( hdl ); } break; case T_DDEGETDATA: /* * syntax: ddegetdata <strvar> <datahandle> */ if( !getVarName( &str, tmp1, vl ) ) { rc = ERR_INVALID_DDE; break; } str = Expand( tmp3, str, vl ); if( !GetHDDEDATA( &str, &data ) ) { rc = ERR_INVALID_DDE; break; } len = DdeGetData( data, NULL, 0, 0 ); ptr = MemAlloc( len ); DdeGetData( data, (LPBYTE)ptr, len, 0 ); VarAddStr( tmp1, ptr, vl ); MemFree( ptr ); // DdeFreeDataHandle( data ); break; case T_DDECREATEDATAHANDLE: /* * syntax: ddecreatedatahandle <handlevar> <itemhandle> "<string>" */ if( !getVarName( &str, tmp1, vl ) ) { rc = ERR_INVALID_DDE; break; } str = Expand( tmp3, str, vl ); if( !GetHSZ( &str, &hdl ) ) { rc = ERR_INVALID_DDE; break; } if( GetStringWithPossibleQuote( &str, tmp2 ) != ERR_NO_ERR ) { rc = ERR_INVALID_DDE; break; } data = DdeCreateDataHandle( DDEInstId, (LPBYTE)tmp2, strlen( tmp2 ) + 1, 0, hdl, ClipboardFormat, 0 ); if( data == (HDDEDATA)NULL ) { rc = ERR_DDE_FAIL; } else { sprintf( tmp2, "%ld", (long)data ); VarAddStr( tmp1, tmp2, vl ); } break; case T_DDECONNECT: /* * syntax: ddeconnect <convvar> <serverhandle> <topichandle> */ if( !getVarName( &str, tmp1, vl ) ) { rc = ERR_INVALID_DDE; break; } str = Expand( tmp3, str, vl ); if( !GetHSZ( &str, &serverhdl ) ) { rc = ERR_INVALID_DDE; break; } if( !GetHSZ( &str, &topichdl ) ) { rc = ERR_INVALID_DDE; break; } hconv = DdeConnect( DDEInstId, serverhdl, topichdl, NULL ); if( hconv == (HCONV)NULL ) { rc = ERR_DDE_FAIL; } else { sprintf( tmp2, "%ld", (long)hconv ); VarAddStr( tmp1, tmp2, vl ); } break; case T_DDEDISCONNECT: /* * syntax: ddedisconnect <hconv> */ str = Expand( tmp3, str, vl ); if( !GetHCONV( &str, &hconv ) ) { rc = ERR_INVALID_DDE; } else { DdeDisconnect( hconv ); } break; case T_DDEREQUEST: /* * syntax: dderequest <datavar> <conv> <strhandle> */ if( !getVarName( &str, tmp1, vl ) ) { rc = ERR_INVALID_DDE; break; } str = Expand( tmp3, str, vl ); if( !GetHCONV( &str, &hconv ) ) { rc = ERR_INVALID_DDE; break; } if( !GetHSZ( &str, &hdl ) ) { rc = ERR_INVALID_DDE; break; } data = DdeClientTransaction( NULL, 0, hconv, hdl, ClipboardFormat, XTYP_REQUEST, TIME_OUT, &dword ); if( data == (HDDEDATA)NULL ) { rc = ERR_DDE_FAIL; } else { len = DdeGetData( data, NULL, 0, 0 ) + 1; ptr = MemAlloc( len ); DdeGetData( data, (LPBYTE)ptr, len, 0 ); VarAddStr( tmp1, ptr, vl ); MemFree( ptr ); DdeFreeDataHandle( data ); } break; case T_DDEPOKE: /* * syntax: ddepoke "<data>" <conv> <strhandle> */ str = Expand( tmp3, str, vl ); if( GetStringWithPossibleQuote( &str, tmp1 ) != ERR_NO_ERR ) { rc = ERR_INVALID_DDE; break; } if( !GetHCONV( &str, &hconv ) ) { rc = ERR_INVALID_DDE; break; } if( !GetHSZ( &str, &hdl ) ) { rc = ERR_INVALID_DDE; break; } data = DdeCreateDataHandle( DDEInstId, (LPBYTE)tmp1, strlen( tmp1 ) + 1, 0L, hdl, ClipboardFormat, 0 ); if( data == (HDDEDATA)NULL ) { rc = ERR_DDE_FAIL; } else { DdeClientTransaction( (LPBYTE)data, -1, hconv, hdl, ClipboardFormat, XTYP_POKE, TIME_OUT, NULL ); } break; } *result = rc; return( true ); } /* RunDDECommand */