| 1993 | */ |
| 1994 | |
| 1995 | static VAR_PARSE * parse_variable( char const * * string ) |
| 1996 | { |
| 1997 | VAR_PARSE_VAR * const result = var_parse_var_new(); |
| 1998 | VAR_PARSE_GROUP * const name = result->name; |
| 1999 | char const * s = *string; |
| 2000 | for ( ; ; ) |
| 2001 | { |
| 2002 | if ( try_parse_variable( &s, string, name ) ) {} |
| 2003 | else if ( s[ 0 ] == ':' ) |
| 2004 | { |
| 2005 | VAR_PARSE_GROUP * mod; |
| 2006 | var_parse_group_maybe_add_constant( name, *string, s ); |
| 2007 | ++s; |
| 2008 | *string = s; |
| 2009 | mod = var_parse_var_new_modifier( result ); |
| 2010 | for ( ; ; ) |
| 2011 | { |
| 2012 | if ( try_parse_variable( &s, string, mod ) ) {} |
| 2013 | else if ( s[ 0 ] == ')' ) |
| 2014 | { |
| 2015 | var_parse_group_maybe_add_constant( mod, *string, s ); |
| 2016 | *string = ++s; |
| 2017 | return (VAR_PARSE *)result; |
| 2018 | } |
| 2019 | else if ( s[ 0 ] == '(' ) |
| 2020 | { |
| 2021 | ++s; |
| 2022 | balance_parentheses( &s, string, mod ); |
| 2023 | } |
| 2024 | else if ( s[ 0 ] == ':' ) |
| 2025 | { |
| 2026 | var_parse_group_maybe_add_constant( mod, *string, s ); |
| 2027 | *string = ++s; |
| 2028 | mod = var_parse_var_new_modifier( result ); |
| 2029 | } |
| 2030 | else if ( s[ 0 ] == '[' ) |
| 2031 | { |
| 2032 | parse_error("unexpected subscript"); |
| 2033 | ++s; |
| 2034 | } |
| 2035 | else if ( s[ 0 ] == '\0' ) |
| 2036 | { |
| 2037 | parse_error( "unbalanced parentheses" ); |
| 2038 | var_parse_group_maybe_add_constant( mod, *string, s ); |
| 2039 | *string = s; |
| 2040 | return (VAR_PARSE *)result; |
| 2041 | } |
| 2042 | else |
| 2043 | ++s; |
| 2044 | } |
| 2045 | } |
| 2046 | else if ( s[ 0 ] == '[' ) |
| 2047 | { |
| 2048 | VAR_PARSE_GROUP * subscript = var_parse_group_new(); |
| 2049 | result->subscript = subscript; |
| 2050 | var_parse_group_maybe_add_constant( name, *string, s ); |
| 2051 | *string = ++s; |
| 2052 | for ( ; ; ) |
no test coverage detected