Ejemplo n.º 1
0
void printHashtable(Hashtable *env, char* buf2) {
    int i;
    char typeNameBuf[128];
    sprintf(buf2, "len: %d\n", env->len);
    int k = 0;
    for (i = 0; i < env->size; i++) {
        struct bucket *b = env->buckets[i];
        while (b != NULL) {
            Res *res = (Res *) b->value;
            if (k != 0)strncat(buf2, "\n", MAX_NAME_LEN - strlen(buf2));
            strncat(buf2, b->key, MAX_NAME_LEN - strlen(buf2));
            strncat(buf2, "=", MAX_NAME_LEN - strlen(buf2));
            if (res == NULL) {
                strncat(buf2, "<null>", MAX_NAME_LEN - strlen(buf2));
            } else {
                char *buf4 = convertResToString(res);
                strncat(buf2, buf4, MAX_NAME_LEN - strlen(buf2));
                strncat(buf2, ":", MAX_NAME_LEN - strlen(buf2));
                strncat(buf2, res->exprType == NULL? "<null>" : typeToString(res->exprType, NULL, typeNameBuf, 128), MAX_NAME_LEN - strlen(buf2));
                free(buf4);
            }
            k++;
            b = b->next;
        }
    }
}
Ejemplo n.º 2
0
int
getSessionVarValue( char *action, char *varName, ruleExecInfo_t *rei,
                    char **varValue ) {
    char *varMap;
    int i, vinx;
    Res *res;

    Region *r = make_region( 0, NULL );
    vinx = getVarMap( action, varName, &varMap, 0 );
    while ( vinx >= 0 ) {
        i = getVarValue( varMap, rei, &res, r );
        if ( i >= 0 ) {
            free( varMap );
            *varValue = convertResToString( res );
            region_free( r );
            return( i );
        }
        else if ( i == NULL_VALUE_ERR ) {
            free( varMap );
            vinx = getVarMap( action, varName, &varMap, vinx + 1 );
        }
        else {
            free( varMap );
            region_free( r );
            return( i );
        }
    }
    region_free( r );
    if ( vinx < 0 ) {
        return( vinx );
    }
    return( i );
}
Ejemplo n.º 3
0
int
getSessionVarValue( char *action, char *varName, ruleExecInfo_t *rei,
                    char **varValue ) {
    Region *r = make_region( 0, NULL );
    char *varMap;
    int vinx = getVarMap( action, varName, &varMap, 0 );
    while ( vinx >= 0 ) {
        Res *res;
        int i = getVarValue( varMap, rei, &res, r );
        free( varMap );
        if ( i != NULL_VALUE_ERR ) {
            if ( i >= 0 ) {
                *varValue = convertResToString( res );
            }
            region_free( r );
            return i;
        }
        vinx = getVarMap( action, varName, &varMap, vinx + 1 );
    }
    free( varMap );
    region_free( r );
    return vinx;
}
Ejemplo n.º 4
0
/************* Res to String *********************/
char* convertResToString(Res *res0) {
    char *res;
    char *type;
    int j;
	switch (getNodeType(res0)) {

	case N_ERROR:
		res = (char *)malloc(sizeof(char)*1024);
		snprintf(res, 1024, "error %d", RES_ERR_CODE(res0));
		return res;
	case N_VAL:
		switch(TYPE(res0)) {
            case T_INT:
            case T_DOUBLE:
                res = (char *)malloc(sizeof(char)*1024);
				if(res0->dval==(int)res0->dval) {
					snprintf(res, 1024, "%d", (int)res0->dval);
				} else {
					snprintf(res, 1024, "%f", res0->dval);
				}
				return res;
            case T_STRING:
                if(res0->text == NULL) {
                    res = strdup("<null>");
                } else {
                    res = strdup(res0->text);
                }
                return res;
            case T_PATH:
                if(res0->text == NULL) {
                    res = strdup("<null>");
                } else {
                    res = strdup(res0->text);
                }
                return res;
            case T_IRODS:
                res = (char *)malloc(sizeof(char)*1024);
                res[0] = 0;
                type = res0->exprType->text;
				if(strcmp(type, KeyValPair_MS_T)==0) {
					keyValPair_t *kvp = (keyValPair_t *) RES_UNINTER_STRUCT(res0);
					snprintf(res, 1024, "KeyValue[%d]:", kvp->len);
					int i;
					for(i=0;i<kvp->len;i++) {
						snprintf(res + strlen(res), 1024 - strlen(res), "%s=%s;", kvp->keyWord[i],kvp->value[i]);
					}

				} else if (strcmp(type, BUF_LEN_MS_T) == 0 ) {
				    snprintf(res + strlen(res), 1024 - strlen(res),"%d",*(int*)res0->param->inOutStruct);
				} else if (strcmp(type, DataObjInp_MS_T) == 0) {
				    dataObjInp_t dataObjInp, *myDataObjInp;
				    j = parseMspForDataObjInp (res0->param, &dataObjInp, &myDataObjInp, 0);
				    if (j < 0)
				    	snprintf(res + strlen(res), 1024 - strlen(res), "<error>");
				    else
				    	snprintf(res + strlen(res), 1024 - strlen(res), "%s",(char *) myDataObjInp->objPath);
				} else if (strcmp(type, CollInp_MS_T ) == 0) {
				    collInp_t collCreateInp, *myCollCreateInp;
				    j = parseMspForCollInp (res0->param, &collCreateInp, &myCollCreateInp, 0);
				    if (j < 0)
				    	snprintf(res + strlen(res), 1024 - strlen(res), "<error>");
				    else
				    	snprintf(res + strlen(res), 1024 - strlen(res), "%s", myCollCreateInp->collName);
				} else if (strcmp(type,  DataObjCopyInp_MS_T) == 0) {
				    dataObjCopyInp_t dataObjCopyInp, *myDataObjCopyInp;
				    j = parseMspForDataObjCopyInp (res0->param, &dataObjCopyInp, &myDataObjCopyInp);
				    if (j < 0)
				    	snprintf(res + strlen(res), 1024 - strlen(res), "<error>");
				    else
				    	snprintf (res + strlen(res), 1024 - strlen(res), "COPY(%s,%s)",
				    			myDataObjCopyInp->srcDataObjInp.objPath, myDataObjCopyInp->destDataObjInp.objPath);
				} else if (strcmp(type,  DataObjReadInp_MS_T) == 0
					   || strcmp(type, DataObjCloseInp_MS_T) == 0
					   || strcmp(type, DataObjWriteInp_MS_T) == 0 ) {
				    openedDataObjInp_t  *myDataObjReadInp;
				    myDataObjReadInp = (openedDataObjInp_t  *) res0->param->inOutStruct;
				    snprintf (res + strlen(res), 1024 - strlen(res), "OPEN(%d)",myDataObjReadInp->len);
				} else if (strcmp(type, ExecCmd_MS_T  ) == 0) {
				      execCmd_t *execCmd;
				      execCmd = (execCmd_t *)  res0->param->inOutStruct;
				      snprintf(res + strlen(res), 1024 - strlen(res), "%s", execCmd->cmd);
				} else {
					snprintf(res, 1024, "<value>");
				}
				return res;
            case T_BOOL:
                res = strdup(RES_BOOL_VAL(res0)?"true":"false");
                return res;
            case T_CONS:
                res = (char *)malloc(sizeof(char)*1024);
                sprintf(res, "[");
                int i;
                for(i=0;i<res0->degree;i++) {
                    char *resElem = convertResToString(res0->subtrees[i]);
                    if(resElem == NULL) {
                        free(res);
                        return NULL;
                    } else {
                        snprintf(res+strlen(res), 1024-strlen(res), "%s%s", i==0?"":",",resElem);
                        free(resElem);
                    }
                }
                snprintf(res+strlen(res), 1024-strlen(res), "]");
				return res;
            case T_DATETIME:
				res = (char *)malloc(sizeof(char)*1024);
				ttimestr(res, 1024-1, "", &RES_TIME_VAL(res0));
				return res;
            case T_UNSPECED:
                res = strdup("<undefined>");
                return res;
            default:
                /*sprintf(res, "error: unsupported type %d", TYPE(res0)); */
                return NULL;
		}
		break;
		default:
			res = (char *)malloc(sizeof(char)*128);
			return typeToString(res0, NULL, res, 128);
	}
}
Ejemplo n.º 5
0
int processXMsg( int streamId, char *readmsg,
                 RuleEngineEventParam *param, Node *node,
                 Env *env, ruleExecInfo_t *rei ) {

    char myhdr[HEADER_TYPE_LEN];
    char mymsg[MAX_NAME_LEN];
    char *outStr = NULL;
    int i, n;
    int iLevel, wCnt;
    int  ruleInx = 0;
    Region *r;
    Res *res;
    rError_t errmsg;
    errmsg.len = 0;
    errmsg.errMsg = NULL;
    r = make_region( 0, NULL );
    ParserContext *context = newParserContext( &errmsg, r );
    Pointer *e = newPointer2( readmsg );
    int rulegen = 1;
    int found;
    int grdf[2];
    int cmd = 0;
    int smallW;

    snprintf( myhdr, HEADER_TYPE_LEN - 1,   "idbug:%s", param->actionName );
    memset( mymsg, 0, sizeof( mymsg ) );

    PARSER_BEGIN( DbgCmd )
    TRY( DbgCmd )
    TTEXT2( "n", "next" );
    cmd = REDEBUG_STEP_OVER;
    OR( DbgCmd )
    TTEXT2( "s", "step" );
    cmd = REDEBUG_NEXT;
    OR( DbgCmd )
    TTEXT2( "f", "finish" );
    cmd = REDEBUG_STEP_OUT;
    OR( DbgCmd )
    TTEXT2( "b", "break" );
    TRY( Param )
    TTYPE( TK_TEXT );
    int breakPointsInx2;
    for ( breakPointsInx2 = 0; breakPointsInx2 < 100; breakPointsInx2++ ) {
        if ( breakPoints[breakPointsInx2].actionName == NULL ) {
            break;
        }
    }
    if ( breakPointsInx2 == 100 ) {
        _writeXMsg( streamId, myhdr, "Maximum breakpoint count reached. Breakpoint not set.\n" );
        cmd = REDEBUG_WAIT;
    }
    else {
        breakPoints[breakPointsInx2].actionName = strdup( token->text );
        char * base_ptr = NULL;
        TRY( loc )
        TTYPE( TK_TEXT );
        base_ptr = ( char * ) malloc( sizeof( token->text ) + 2 );
        base_ptr[0] = 'f';
        strcpy( base_ptr + 1, token->text );
        TTEXT( ":" );
        TTYPE( TK_INT );
        breakPoints[breakPointsInx2].base = strdup( base_ptr );
        breakPoints[breakPointsInx2].line = atoi( token->text );
        rodsLong_t range[2];
        char rulesFileName[MAX_NAME_LEN];
        getRuleBasePath( base_ptr, rulesFileName );

        FILE *file;
        /* char errbuf[ERR_MSG_LEN]; */
        file = fopen( rulesFileName, "r" );
        if ( file == NULL ) {
            free( context );
            deletePointer( e );
            free( base_ptr );
            return RULES_FILE_READ_ERROR;
        }
        Pointer *p = newPointer( file, base_ptr );


        if ( getLineRange( p, breakPoints[breakPointsInx2].line, range ) == 0 ) {
            breakPoints[breakPointsInx2].start = range[0];
            breakPoints[breakPointsInx2].finish = range[1];
        }
        else {
            breakPoints[breakPointsInx2].actionName = NULL;
        }
        deletePointer( p );
        OR( loc )
        TTYPE( TK_INT );
        if ( node != NULL ) {
            breakPoints[breakPointsInx2].base = strdup( node->base );
            breakPoints[breakPointsInx2].line = atoi( token->text );
            rodsLong_t range[2];
            Pointer *p = newPointer2( breakPoints[breakPointsInx2].base );
            if ( getLineRange( p, breakPoints[breakPointsInx2].line, range ) == 0 ) {
                breakPoints[breakPointsInx2].start = range[0];
                breakPoints[breakPointsInx2].finish = range[1];
            }
            else {
                breakPoints[breakPointsInx2].actionName = NULL;
            }
            deletePointer( p );
        }
        else {
            breakPoints[breakPointsInx2].actionName = NULL;
        }
        OR( loc )
        /* breakPoints[breakPointsInx].base = NULL; */
        END_TRY( loc )

        free( base_ptr );
        if ( breakPoints[breakPointsInx2].actionName != NULL )
            snprintf( mymsg, MAX_NAME_LEN, "Breakpoint %i  set at %s\n", breakPointsInx2,
                      breakPoints[breakPointsInx2].actionName );
        else {
            snprintf( mymsg, MAX_NAME_LEN, "Cannot set breakpoint, source not available\n" );
        }
        _writeXMsg( streamId, myhdr, mymsg );
        if ( breakPointsInx <= breakPointsInx2 ) {
            breakPointsInx = breakPointsInx2 + 1;
        }
        cmd = REDEBUG_WAIT;
    }
    OR( Param )
    NEXT_TOKEN_BASIC;
    _writeXMsg( streamId, myhdr, "Unknown parameter type.\n" );
    cmd = REDEBUG_WAIT;
    OR( Param )
    _writeXMsg( streamId, myhdr, "Debugger command \'break\' requires at least one argument.\n" );
    cmd = REDEBUG_WAIT;
    END_TRY( Param )

    OR( DbgCmd )
    TRY( Where )
    TTEXT2( "w", "where" );
    smallW = 1;
    OR( Where )
    TTEXT2( "W", "Where" );
    smallW = 0;
    END_TRY( Where )
    wCnt = 20;
    OPTIONAL_BEGIN( Param )
    TTYPE( TK_INT );
    wCnt = atoi( token->text );
    OPTIONAL_END( Param )
    iLevel = 0;

    i = reDebugStackCurrPtr - 1;
    while ( i >= 0 && wCnt > 0 ) {
        if ( !smallW || ( reDebugPCType( ( RuleEngineEvent ) reDebugStackCurr[i].label ) & 1 ) != 0 ) {
            snprintf( myhdr, HEADER_TYPE_LEN - 1,   "idbug: Level %3i", iLevel );
            char msg[HEADER_TYPE_LEN - 1];
            RuleEngineEventParam param;
            param.ruleIndex = 0;
            param.actionName = reDebugStackCurr[i].step;
            printRuleEngineEventLabel( msg, HEADER_TYPE_LEN - 1, ( RuleEngineEvent ) reDebugStackCurr[i].label, &param );
            _writeXMsg( streamId,  myhdr, msg );
            if ( reDebugStackCurr[i].label != EXEC_ACTION_BEGIN ) {
                iLevel++;
            }
            wCnt--;
        }
        i--;
    }
    OR( DbgCmd )
    TTEXT2( "l", "list" );
    TRY( Param )
    TTEXT2( "r", "rule" );
    TRY( ParamParam )
    TTYPE( TK_TEXT );

    mymsg[0] = '\n';
    mymsg[1] = '\0';
    snprintf( myhdr, HEADER_TYPE_LEN - 1,   "idbug: Listing %s", token->text );
    RuleIndexListNode *node;
    found = 0;
    while ( findNextRule2( token->text, ruleInx, &node ) != NO_MORE_RULES_ERR ) {
        found = 1;
        if ( node->secondaryIndex ) {
            n = node->condIndex->valIndex->len;
            int i;
            for ( i = 0; i < n; i++ ) {
                Bucket *b = node->condIndex->valIndex->buckets[i];
                while ( b != NULL ) {
                    RuleDesc *rd = getRuleDesc( *( int * )b->value );
                    char buf[MAX_RULE_LEN];
                    ruleToString( buf, MAX_RULE_LEN, rd );
                    snprintf( mymsg + strlen( mymsg ), MAX_NAME_LEN - strlen( mymsg ), "%i: %s\n%s\n", node->ruleIndex, rd->node->base[0] == 's' ? "<source>" : rd->node->base + 1, buf );
                    b = b->next;
                }
            }
        }
        else {
            RuleDesc *rd = getRuleDesc( node->ruleIndex );
            char buf[MAX_RULE_LEN];
            ruleToString( buf, MAX_RULE_LEN, rd );
            snprintf( mymsg + strlen( mymsg ), MAX_NAME_LEN - strlen( mymsg ), "\n  %i: %s\n%s\n", node->ruleIndex, rd->node->base[0] == 's' ? "<source>" : rd->node->base + 1, buf );
        }
        ruleInx ++;
    }
    if ( !found ) {
        snprintf( mymsg, MAX_NAME_LEN, "Rule %s not found\n", token->text );
    }
    _writeXMsg( streamId, myhdr, mymsg );
    cmd = REDEBUG_WAIT;
    OR( ParamParam )
    _writeXMsg( streamId, myhdr, "Debugger command \'list rule\' requires one argument.\n" );
    cmd = REDEBUG_WAIT;
    END_TRY( ParamParam )
    OR( Param )
    TTEXT2( "b", "breakpoints" );
    snprintf( myhdr, HEADER_TYPE_LEN - 1,   "idbug: Listing %s", token->text );
    mymsg[0] = '\n';
    mymsg[1] = '\0';
    for ( i = 0; i < breakPointsInx; i++ ) {
        if ( breakPoints[i].actionName != NULL ) {
            if ( breakPoints[i].base != NULL ) {
                snprintf( mymsg + strlen( mymsg ), MAX_NAME_LEN - strlen( mymsg ), "Breaking at BreakPoint %i:%s %s:%d\n", i , breakPoints[i].actionName, breakPoints[i].base[0] == 's' ? "<source>" : breakPoints[i].base + 1, breakPoints[i].line );
            }
            else {
                snprintf( mymsg + strlen( mymsg ), MAX_NAME_LEN - strlen( mymsg ), "Breaking at BreakPoint %i:%s\n", i , breakPoints[i].actionName );
            }
        }
    }
    _writeXMsg( streamId, myhdr, mymsg );
    cmd = REDEBUG_WAIT;
    OR( Param )
    TTEXT( "*" );
    snprintf( myhdr, HEADER_TYPE_LEN - 1,   "idbug: Listing %s", token->text );
    Env *cenv = env;
    mymsg[0] = '\n';
    mymsg[1] = '\0';
    found = 0;
    while ( cenv != NULL ) {
        n = cenv->current->size;
        for ( i = 0; i < n; i++ ) {
            Bucket *b = cenv->current->buckets[i];
            while ( b != NULL ) {
                if ( b->key[0] == '*' ) { /* skip none * variables */
                    found = 1;
                    char typeString[128];
                    typeToString( ( ( Res * )b->value )->exprType, NULL, typeString, 128 );
                    snprintf( mymsg + strlen( mymsg ), MAX_NAME_LEN - strlen( mymsg ), "%s of type %s\n", b->key, typeString );
                }
                b = b->next;
            }
        }
        cenv = cenv->previous;
    }
    if ( !found ) {
        snprintf( mymsg + strlen( mymsg ), MAX_NAME_LEN - strlen( mymsg ), "<empty>\n" );
    }
    _writeXMsg( streamId, myhdr, mymsg );
    cmd = REDEBUG_WAIT;
    OR( Param )
    syncTokenQueue( e, context );
    skipWhitespace( e );
    ABORT( lookAhead( e, 0 ) != '$' );
    snprintf( myhdr, HEADER_TYPE_LEN - 1,   "idbug: Listing %s", token->text );
    mymsg[0] = '\n';
    mymsg[1] = '\0';
    Hashtable *vars = newHashTable( 100 );
    for ( i = 0; i < coreRuleVarDef .MaxNumOfDVars; i++ ) {
        if ( lookupFromHashTable( vars, coreRuleVarDef.varName[i] ) == NULL ) {
            snprintf( &mymsg[strlen( mymsg )], MAX_NAME_LEN - strlen( mymsg ), "$%s\n", coreRuleVarDef.varName[i] );
            insertIntoHashTable( vars, coreRuleVarDef.varName[i], coreRuleVarDef.varName[i] );
        }
    }
    deleteHashTable( vars, NULL );
    _writeXMsg( streamId, myhdr, mymsg );
    cmd = REDEBUG_WAIT;
    OR( Param )
    NEXT_TOKEN_BASIC;
    _writeXMsg( streamId, myhdr, "Unknown parameter type.\n" );
    cmd = REDEBUG_WAIT;
    OR( Param )
    _writeXMsg( streamId, myhdr, "Debugger command \'list\' requires at least one argument.\n" );
    cmd = REDEBUG_WAIT;
    END_TRY( Param )
    OR( DbgCmd )
    TTEXT2( "c", "continue" );
    cmd = REDEBUG_STEP_CONTINUE;
    OR( DbgCmd )
    TTEXT2( "C", "Continue" );
    cmd = REDEBUG_CONTINUE_VERBOSE;
    OR( DbgCmd )
    TTEXT2( "del", "delete" );
    TRY( Param )
    TTYPE( TK_INT );
    n = atoi( token->text );
    if ( breakPoints[n].actionName != NULL ) {
        free( breakPoints[n].actionName );
        if ( breakPoints[n].base != NULL ) {
            free( breakPoints[n].base );
        }
        breakPoints[n].actionName = NULL;
        breakPoints[n].base = NULL;
        snprintf( mymsg, MAX_NAME_LEN, "Breakpoint %i  deleted\n", n );
    }
    else {
        snprintf( mymsg, MAX_NAME_LEN, "Breakpoint %i  has not been defined\n", n );
    }
    _writeXMsg( streamId, myhdr, mymsg );
    cmd = REDEBUG_WAIT;
    OR( Param )
    _writeXMsg( streamId, myhdr, "Debugger command \'delete\' requires one argument.\n" );
    cmd = REDEBUG_WAIT;
    END_TRY( Param )
    OR( DbgCmd )
    TTEXT2( "p", "print" );
    Node *n = parseTermRuleGen( e, 1, context );
    if ( getNodeType( n ) == N_ERROR ) {
        errMsgToString( context->errmsg, mymsg + strlen( mymsg ), MAX_NAME_LEN - strlen( mymsg ) );
    }
    else {
        snprintf( myhdr, HEADER_TYPE_LEN - 1,   "idbug: Printing " );
        char * ptr = myhdr + strlen( myhdr );
        i = HEADER_TYPE_LEN - 1 - strlen( myhdr );
        termToString( &ptr, &i, 0, MIN_PREC, n, 0 );
        snprintf( ptr, i, "\n" );
        if ( env != NULL ) {
            disableReDebugger( grdf );
            res = computeNode( n, NULL, regionRegionCpEnv( env, r, ( RegionRegionCopyFuncType * ) regionRegionCpNode ), rei, 0, &errmsg, r );
            enableReDebugger( grdf );
            outStr = convertResToString( res );
            snprintf( mymsg, MAX_NAME_LEN, "%s\n", outStr );
            free( outStr );
            if ( getNodeType( res ) == N_ERROR ) {
                errMsgToString( &errmsg, mymsg + strlen( mymsg ), MAX_NAME_LEN - strlen( mymsg ) );
            }
        }
        else {
            snprintf( mymsg, MAX_NAME_LEN, "Runtime environment: <empty>\n" );
        }
    }
    _writeXMsg( streamId, myhdr, mymsg );

    cmd = REDEBUG_WAIT;
    OR( DbgCmd )
    TTEXT2( "d", "discontinue" );
    cmd = REDEBUG_WAIT;
    OR( DbgCmd )
    snprintf( mymsg, MAX_NAME_LEN, "Unknown Action: %s", readmsg );
    _writeXMsg( streamId, myhdr, mymsg );
    cmd = REDEBUG_WAIT;
    END_TRY( DbgCmd )
    PARSER_END( DbgCmd )
    freeRErrorContent( &errmsg );
    region_free( r );
    deletePointer( e );
    free( context );
    return cmd;
}