Beispiel #1
0
static void
expression_free(expression *expression)
{
    if (expression) {
        expression_free(expression->left);
        expression_free(expression->right);
        free(expression->value);
        free(expression);
    }
}
Beispiel #2
0
bool debug_view_expression::recompute()
{
	bool changed = m_dirty;

	// if dirty, re-evaluate
	if (m_dirty)
	{
		// parse the new expression
		parsed_expression *expr;
		EXPRERR exprerr = expression_parse(m_string, m_context, &debug_expression_callbacks, &m_machine, &expr);

		// if it worked, update the expression
		if (exprerr == EXPRERR_NONE)
		{
			if (m_parsed != NULL)
				expression_free(m_parsed);
			m_parsed = expr;
		}
	}

	// if we have a parsed expression, evalute it
	if (m_parsed != NULL)
	{
		UINT64 oldresult = m_result;

		// recompute the value of the expression
		expression_execute(m_parsed, &m_result);
		if (m_result != oldresult)
			changed = true;
	}

	// expression no longer dirty by definition
	m_dirty = false;
	return changed;
}
Beispiel #3
0
static expression *
get_expression(const char *selector)
{
   freesasa_yyscan_t scanner;
   YY_BUFFER_STATE state;
   int err;
   expression *expression = NULL;

   if (freesasa_yylex_init(&scanner)) {
       fail_msg("lexer failed");
   } else {
       state = freesasa_yy_scan_string(selector, scanner);
       err = freesasa_yyparse(&expression, scanner);
       if (err) {
           if (err == 1) fail_msg("parser failed");
           if (err == 2) mem_fail();
           expression_free(expression);
           expression = NULL;
       }
       freesasa_yy_delete_buffer(state, scanner);
       freesasa_yylex_destroy(scanner);
   }

   return expression;
}
Beispiel #4
0
int
main (int argc, char **argv) 
{

  // faire en sorte qu'interactive_mode = 0 lorsque le shell est distant 
  
  if (interactive_mode)
    {
      using_history();
    }
  else
    {
      //  mode distant 
    }
  
  while (1){
    if (my_yyparse () == 0) {  /* L'analyse a abouti */   
      afficher_expr(ExpressionAnalysee);
      status = evaluer_expr(ExpressionAnalysee);
      //printf("Salut %s",ExpressionAnalysee->type);
      fflush(stdout);
      expression_free(ExpressionAnalysee);
    }
    else {
      /* L'analyse de la ligne de commande a donn� une erreur */
    }
  }
  return 0;
}
Beispiel #5
0
expression *
freesasa_selection_operation(expression_type type,
                             expression *left,
                             expression *right)
{
    expression *e = expression_new();

    if (e == NULL) {
        expression_free(left);
        expression_free(right);
    } else {
        e->type = type;
        e->left = left;
        e->right = right;
    }

    return e;
}
/*
 * Libération de la mémoire occupée par une expression
 */
void
expression_free(Expression *e)
{
  if (e == NULL)
    return;
    
  expression_free(e->gauche);
  expression_free(e->droite);

  if (e->arguments != NULL)
    {
      for (int i = 0; e->arguments[i] != NULL; i++)
	free(e->arguments[i]);
      free(e->arguments);  
    }

  free(e);
}
Beispiel #7
0
expression *
freesasa_selection_atom(expression_type type,
                        const char* val)
{
    expression *e = expression_new();
    int i, n;
    char *buf;

    assert(val);

    if (e != NULL) {
        if (type == E_NEGNUM) {
            n = strlen(val)+2;
            buf = malloc(n);
            if (buf == NULL) {
                mem_fail();
                expression_free(e);
                return NULL;
            }
            sprintf(buf, "-%s", val);
            e->type = E_NUMBER;
            e->value = strdup(buf);
            free(buf);
        } else {
            e->type = type;
            e->value = strdup(val);
        }

        if (e->value == NULL) {
            mem_fail();
            expression_free(e);
            return NULL;
        }

        for (i = 0; i < strlen(e->value); ++i)
            e->value[i] = toupper(e->value[i]);
    }
    return e;
}
Beispiel #8
0
void instruction_free (instruction  * i)
{
    switch (i->type)
    {
        case INSTR_CALL:
            free (i->content.call.identifier);
            expression_list_free (i->content.call.arguments);
            break;
        case INSTR_FOR:
            free (i->content.loop.identifier);
            expression_free (i->content.loop.left_boundary);
            expression_free (i->content.loop.right_boundary);
            instruction_list_free (i->content.loop.body);
            break;
        case INSTR_IF:
        case INSTR_IF_ELSE:
            expression_free (i->content.branch.condition);
            instruction_list_free (i->content.branch.true_body);
            if (i->content.branch.has_else)
                instruction_list_free (i->content.branch.false_body);
            break;
        case INSTR_ADVANCE:
            break;
        case INSTR_FINISH:
        case INSTR_ASYNC:
        case INSTR_CLOCKED_FINISH:
        case INSTR_CLOCKED_ASYNC:
            instruction_list_free (i->content.block);
            break;
        default:
            break;
    }

    free (i->annotation.level);
    free (i->annotation.boundaries);
    expression_free (i->annotation.date);

    free (i);
}
Beispiel #9
0
expression *
freesasa_selection_create(expression *selection,
                          const char* id)
{
    expression *e = expression_new();

    assert(id);

    if (e == NULL) expression_free(selection);
    else {
        e->type = E_SELECTION;
        e->left = selection;
        e->value = strdup(id);

        if (e->value == NULL) {
            mem_fail();
            expression_free(e);
            e = NULL;
        }
    }

    return e;
}
Beispiel #10
0
expression *
freesasa_selection_selector(expression_type type,
                            expression *list)
{
    expression *e = expression_new();

    if (e == NULL) {
        expression_free(list);
    } else {
        e->type = type;
        e->left = list;
    }

    return e;
}
Beispiel #11
0
int
main (int argc, char **argv) 
{
	if(argc == 2)
		interactive_mode = 0;

  // faire en sorte qu'interactive_mode = 0 lorsque le shell est distant 
  if (interactive_mode)
    {
      using_history();
    }
  else
    {
      //  mode distant 
    }
  
  while (1){
    if (my_yyparse () == 0) {  /* L'analyse a abouti */   
      // afficher_expr(ExpressionAnalysee);
      
      //printf("\n%s\n", ExpressionAnalysee->arguments[0]);

      evaluer_expr(ExpressionAnalysee);
      //echo(LongueurListe(ExpressionAnalysee->arguments), ExpressionAnalysee->arguments);
      
      // printf("\n%s\n", choices[4]);
      fflush(stdout);
      expression_free(ExpressionAnalysee);
    }
    else {
      /* L'analyse de la ligne de commande a donné une erreur */
    }
  }
   wait(NULL);
  return 0;
}
Beispiel #12
0
void instruction_list_compute_dates (instruction_list * list,
        const expression * e, const char * identifier)
{
    /* Count the advances. */
    expression * advance_count = _count_advances (list);

    /* Compute the dates for the current level. */
    for (instruction_list * current = list; current != NULL;
            current = current->next)
    {
        expression * date;

        if (identifier == NULL)
        {
            /* No identifier? Not in a for loop. */
            date = expression_alloc ();
            date->type = EXPR_NUMBER;
            date->content.number = 0;
        }
        else
        {
            expression * id_expr = expression_alloc ();
            expression * factor = expression_copy (advance_count);

            id_expr->type = EXPR_ID;
            id_expr->content.identifier = strdup (identifier);

            date = expression_mult (id_expr, factor);
        }

        if (e != NULL)
        {
            expression * upper_level = expression_copy (e);

            date = expression_add (date, upper_level);
        }

        current->element->annotation.date = date;
    }

    /* Add the advances. */
    expression * advances = expression_alloc ();
    advances->type = EXPR_NUMBER;
    advances->content.number = 0;
    for (instruction_list * current = list; current != NULL;
            current = current->next)
    {
        instruction * i = current->element;
        instruction_type t = i->type;

        i->annotation.date = expression_add (i->annotation.date,
                expression_copy (advances));

        if (t == INSTR_ADVANCE)
        {
            if (advances->type == EXPR_NUMBER)
                advances->content.number++;
            else
            {
                expression * right = expression_alloc ();
                right->type = EXPR_NUMBER;
                right->content.number = 1;

                advances = expression_add (advances, right);
            }
        }
        else if (t == INSTR_FOR)
        {
            expression * left = expression_copy
                (current->element->content.loop.left_boundary);
            expression * right = expression_copy
                (current->element->content.loop.right_boundary);
            expression * bounds = expression_sub
                (right, left);

            expression * for_block_advances = _count_advances
                (current->element->content.loop.body);

            expression * for_advances =
                expression_mult (bounds, for_block_advances);

            advances = expression_add (advances, for_advances);
        }
    }

    /* Compute the dates for the inner levels. */
    for (instruction_list * current = list; current != NULL;
            current = current->next)
    {
        instruction * i = current->element;
        instruction_type t = i->type;

        if (t != INSTR_CALL && t != INSTR_ADVANCE && t != INSTR_UNKNOWN)
        {
            if (t == INSTR_FOR)
            {
                expression * date = expression_sub
                    (expression_copy (i->annotation.date),
                     expression_copy (i->content.loop.left_boundary));

                instruction_list_compute_dates (i->content.loop.body,
                        date, i->content.loop.identifier);

                expression_free (date);
            }
            else if (t == INSTR_IF)
                instruction_list_compute_dates (i->content.branch.true_body,
                        i->annotation.date, identifier);
            else if (t == INSTR_IF_ELSE)
            {
                instruction_list_compute_dates (i->content.branch.true_body,
                        i->annotation.date, identifier);
                instruction_list_compute_dates (i->content.branch.false_body,
                        i->annotation.date, identifier);
            }
            else
                instruction_list_compute_dates (i->content.block,
                        i->annotation.date, NULL);
        }
    }

    expression_free (advance_count);
    expression_free (advances);
}
Beispiel #13
0
debug_view_expression::~debug_view_expression()
{
	// free our parsed expression
	if (m_parsed != NULL)
		expression_free(m_parsed);
}
Beispiel #14
0
static int
select_area_impl(const char *command,
                 char *name,
                 double *area,
                 const freesasa_structure *structure,
                 const freesasa_result *result)
{
    struct selection *selection = NULL;
    struct expression *expression = NULL;
    const int maxlen = FREESASA_MAX_SELECTION_NAME;
    double sasa = 0;
    int err = 0, warn = 0, n_atoms = 0, j, len;

    assert(name); assert(area);
    assert(command); assert(structure); assert(result);
    assert(freesasa_structure_n(structure) == result->n_atoms);

    *area = 0;
    name[0] = '\0';

    expression = get_expression(command);
    selection = selection_new(result->n_atoms);

    if (selection == NULL) {
        return fail_msg("");
    }

    if (expression != NULL && selection != NULL) {
        switch (select_atoms(selection, expression, structure)) {
        case FREESASA_FAIL:
            err = 1;
            break;
        case FREESASA_WARN:
            warn = 1; /* proceed with calculation, print warning later */
        case FREESASA_SUCCESS: {
            for (j = 0; j < selection->size; ++j) {
                ++n_atoms;
                sasa += selection->atom[j]*result->sasa[j];
            }

            *area = sasa;
            len = strlen(selection->name);
            if (len > maxlen) {
                strncpy(name,selection->name,maxlen);
                name[maxlen] = '\0';
            }
            else {
                strncpy(name,selection->name,len);
                name[len] = '\0';
            }

            break;
        }
        default:
            assert(0);
        }
    } else {
        err = 1;
    }
    selection_free(selection);
    expression_free(expression);

    if (err)
        return fail_msg("problems parsing expression '%s'",command);
    if (warn)
        return freesasa_warn("in %s(): There were warnings",__func__);
    return n_atoms;
}