diff options
author | suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp> | 2011-01-06 17:42:52 +0900 |
---|---|---|
committer | suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp> | 2011-01-09 23:33:29 +0900 |
commit | d1543e350ac2d17fa984469933e234fb3946f8d7 (patch) | |
tree | 1bbf6d7cc295c4a0a14f57142fb6a9f0214bfd00 | |
parent | 48b338685330c7eff6c041d8b1de78bd38867200 (diff) |
update ft_mem_check_site_alloc_environment() for new syntax
-rw-r--r-- | src/base/ftdbgmem.c | 61 |
1 files changed, 35 insertions, 26 deletions
diff --git a/src/base/ftdbgmem.c b/src/base/ftdbgmem.c index d46ac7fa..c1e43642 100644 --- a/src/base/ftdbgmem.c +++ b/src/base/ftdbgmem.c @@ -515,40 +515,49 @@ ft_mem_check_site_alloc_environment( FT_MemSource source, const char* env_var_name ) { - char *source_basename = basename( (char *)source->file_name ); + char *source_basename = ft_basename( (char *)source->file_name ); char *c, *c0; - /* environment is unset */ + /* return if environment is unset */ c = c0 = getenv( env_var_name ); if ( !c ) return -1; - /* basename not found */ - if ( NULL == ( c = ft_strstr( c, source_basename ) ) ) - return -1; - - /* found position was substring */ - if ( c != c0 && *(c-1) != ',' && *(c-1) != '/' ) - return -1; - - /* invalid syntax without line number */ - c = c + strlen( source_basename ); - if ( ':' != *c ) - return -1; - - /* line number differs */ - if ( atoi( c + 1 ) != source->line_no ) - return -1; - - /* invalid syntax without max memory space */ - if ( NULL == ft_strchr( c + 1, ':' ) ) - return -1; - c = ft_strchr( c + 1, ':' ); - if ( !ft_isdigit( c[1] ) ) - return -1; + /* return if basename not found anymore */ + while ( NULL != ( c = ft_strstr( c, source_basename ) ) ) + { + /* skip if partial match of basename */ + if ( c != c0 && *(c-1) != ' ' && *(c-1) != PLATFORM_PATH_SEPARATOR[0] ) + goto NextToken; + + /* goto line number after ':' */ + c = c + ft_strlen( source_basename ); + if ( ':' != *c || !ft_isdigit( c[1] ) ) + goto NextToken; + c++; + + /* compare line number */ + if ( atoi( c ) != source->line_no ) + goto NextToken; + + while ( ft_isdigit( *c ) ) + c++; + + /* check alloc limiter after ',' */ + if ( ',' != *c || !ft_isdigit( c[1] ) ) + goto NextToken; + c++; + return atoi( c ); + + NextToken: + c = ft_strchr( c, ' ' ); + if ( !c ) /* no token anymore */ + break; - return atoi( c + 1 ); + c++; + } + return -1; } |