Lines Matching refs:str

121 ULONG parse_expression(char *str);   /* top-level interface to parser */
122 ULONG assignment_expr(char **str); /* assignments =, +=, *=, etc */
123 ULONG do_assignment_operator(char **str, char *var_name);
124 ULONG logical_or_expr(char **str); /* logical OR `||' */
125 ULONG logical_and_expr(char **str); /* logical AND `&&' */
126 ULONG or_expr(char **str); /* OR `|' */
127 ULONG xor_expr(char **str); /* XOR `^' */
128 ULONG and_expr(char **str); /* AND `&' */
129 ULONG equality_expr(char **str); /* equality ==, != */
130 ULONG relational_expr(char **str); /* relational <, >, <=, >= */
131 ULONG shift_expr(char **str); /* shifts <<, >> */
132 ULONG add_expression(char **str); /* addition/subtraction +, - */
133 ULONG term(char **str); /* multiplication/division *,%,/ */
134 ULONG factor(char **str); /* negation, logical not ~, ! */
135 ULONG get_value(char **str);
140 char *skipwhite(char *str); /* skip over input white space */
304 parse_expression(char *str)
307 char *ptr = str;
331 assignment_expr(char **str)
338 *str = skipwhite(*str);
339 orig_str = *str;
341 var_name = get_var_name(str);
343 *str = skipwhite(*str);
344 if (**str == EQUAL && *(*str+1) != EQUAL)
346 *str = skipwhite(*str + 1); /* skip the equal sign */
348 val = assignment_expr(str); /* go recursive! */
355 else if (((**str == PLUS || **str == MINUS || **str == OR ||
356 **str == TIMES || **str == DIVISION || **str == MODULO ||
357 **str == AND || **str == XOR) && *(*str+1) == EQUAL) ||
358 strncmp(*str, "<<=", 3) == 0 || strncmp(*str, ">>=", 3) == 0)
360 val = do_assignment_operator(str, var_name);
364 *str = orig_str;
365 val = logical_or_expr(str); /* no equal sign, just get var value */
367 *str = skipwhite(*str);
368 if (**str == EQUAL)
382 do_assignment_operator(char **str, char *var_name)
388 operator = **str;
391 *str = skipwhite(*str + 3);
393 *str = skipwhite(*str + 2); /* skip the assignment operator */
395 val = assignment_expr(str); /* go recursive! */
446 logical_or_expr(char **str)
450 *str = skipwhite(*str);
452 sum = logical_and_expr(str);
454 *str = skipwhite(*str);
455 while(**str == OR && *(*str + 1) == OR)
457 *str = skipwhite(*str + 2); /* advance over the operator */
459 val = logical_and_expr(str);
470 logical_and_expr(char **str)
474 *str = skipwhite(*str);
476 sum = or_expr(str);
478 *str = skipwhite(*str);
479 while(**str == AND && *(*str + 1) == AND)
481 *str = skipwhite(*str + 2); /* advance over the operator */
483 val = or_expr(str);
493 or_expr(char **str)
497 *str = skipwhite(*str);
499 sum = xor_expr(str);
501 *str = skipwhite(*str);
502 while(**str == OR && *(*str+1) != OR)
504 *str = skipwhite(*str + 1); /* advance over the operator */
506 val = xor_expr(str);
517 xor_expr(char **str)
521 *str = skipwhite(*str);
523 sum = and_expr(str);
525 *str = skipwhite(*str);
526 while(**str == XOR)
528 *str = skipwhite(*str + 1); /* advance over the operator */
530 val = and_expr(str);
541 and_expr(char **str)
545 *str = skipwhite(*str);
547 sum = equality_expr(str);
549 *str = skipwhite(*str);
550 while(**str == AND && *(*str+1) != AND)
552 *str = skipwhite(*str + 1); /* advance over the operator */
554 val = equality_expr(str);
564 equality_expr(char **str)
569 *str = skipwhite(*str);
571 sum = relational_expr(str);
573 *str = skipwhite(*str);
574 while((**str == EQUAL && *(*str+1) == EQUAL) ||
575 (**str == BANG && *(*str+1) == EQUAL))
577 op = **str;
579 *str = skipwhite(*str + 2); /* advance over the operator */
581 val = relational_expr(str);
594 relational_expr(char **str)
599 *str = skipwhite(*str);
601 sum = shift_expr(str);
603 *str = skipwhite(*str);
604 while(**str == LESS_THAN || **str == GREATER_THAN)
607 op = **str;
609 if (*(*str+1) == EQUAL)
612 *str = *str+1; /* skip initial operator */
615 *str = skipwhite(*str + 1); /* advance over the operator */
617 val = shift_expr(str);
643 shift_expr(char **str)
648 *str = skipwhite(*str);
650 sum = add_expression(str);
652 *str = skipwhite(*str);
653 while((strncmp(*str, "<<", 2) == 0) || (strncmp(*str, ">>", 2) == 0))
655 op = **str;
657 *str = skipwhite(*str + 2); /* advance over the operator */
659 val = add_expression(str);
674 add_expression(char **str)
679 *str = skipwhite(*str);
681 sum = term(str);
683 *str = skipwhite(*str);
684 while(**str == PLUS || **str == MINUS)
686 op = **str;
688 *str = skipwhite(*str + 1); /* advance over the operator */
690 val = term(str);
705 term(char **str)
711 sum = factor(str);
712 *str = skipwhite(*str);
719 if (**str != TIMES && **str != DIVISION && **str != MODULO &&
720 **str != PLUS && **str != MINUS && **str != OR &&
721 **str != AND && **str != XOR && **str != BANG &&
722 **str != NEGATIVE && **str != TWIDDLE && **str != RPAREN &&
723 **str != LESS_THAN && **str != GREATER_THAN && **str != SEMI_COLON &&
724 strncmp(*str, "<<", 2) != 0 && strncmp(*str, ">>", 2) &&
725 **str != EQUAL && **str != '\0')
727 fprintf(stderr, "Parsing stopped: unknown operator %s\n", *str);
731 while(**str == TIMES || **str == DIVISION || **str == MODULO)
733 op = **str;
734 *str = skipwhite(*str + 1);
735 val = factor(str);
760 factor(char **str)
767 if (**str == NEGATIVE || **str == PLUS || **str == TWIDDLE || **str == BANG)
769 op = **str; /* must be a unary op */
771 if ((op == NEGATIVE && *(*str + 1) == NEGATIVE) || /* look for ++/-- */
772 (op == PLUS && *(*str + 1) == PLUS))
774 *str = *str + 1;
778 *str = skipwhite(*str + 1);
779 var_name_ptr = *str; /* save where the varname should be */
782 val = get_value(str);
784 *str = skipwhite(*str);
832 get_value(char **str)
838 if (**str == SINGLE_QUOTE) /* a character constant */
842 *str = *str + 1; /* advance over the leading quote */
844 for(i=0; **str && **str != SINGLE_QUOTE && i < sizeof(LONG); *str+=1,i++)
846 if (**str == '\\') /* escape the next char */
847 *str += 1;
850 val |= (ULONG)((unsigned)**str);
853 if (**str != SINGLE_QUOTE) /* constant must have been too long */
857 while(**str && **str != SINGLE_QUOTE)
858 *str += 1;
860 else if (**str != '\0')
861 *str += 1;
863 else if (isdigit(**str)) /* a regular number */
865 val = STRTOUL(*str, str, 0);
867 *str = skipwhite(*str);
869 else if (**str == USE_LAST_RESULT) /* a `.' meaning use the last result */
872 *str = skipwhite(*str+1);
874 else if (**str == LPAREN) /* a parenthesized expression */
876 *str = skipwhite(*str + 1);
878 val = assignment_expr(str); /* start at top and come back down */
880 if (**str == RPAREN)
881 *str = *str + 1;
885 else if (isalpha(**str) || **str == '_') /* a variable name */
887 if ((var_name = get_var_name(str)) == NULL)
904 *str = skipwhite(*str);
905 if (strncmp(*str, "++", 2) == 0 || strncmp(*str, "--", 2) == 0)
910 if (**str == '+')
914 *str = *str + 2;
927 fprintf(stderr, " Got: `%s'\n", *str);
1062 get_var_name(char **str)
1067 if (isalpha(**str) == 0 && **str != '_')
1078 while(**str && (isalnum(**str) || **str == '_'))
1088 buff[i++] = **str;
1089 *str = *str+1;
1094 while (isalnum(**str) || **str == '_') /* skip over any remaining junk */
1095 *str = *str+1;
1103 skipwhite(char *str)
1105 if (str == NULL)
1108 while(*str && (*str == ' ' || *str == '\t' || *str == '\n' || *str == '\f'))
1109 str++;
1111 return str;