]> granicus.if.org Git - php/commitdiff
"undefined function" error message will now suggest similar named
authorHartmut Holzgraefe <hholzgra@php.net>
Tue, 1 Aug 2000 07:57:19 +0000 (07:57 +0000)
committerHartmut Holzgraefe <hholzgra@php.net>
Tue, 1 Aug 2000 07:57:19 +0000 (07:57 +0000)
functions as jikes compiler for java does (typo protection)

ext/standard/levenshtein.c
main/main.c

index 002f9fabe92fa17206814d2158c98ec7d6c2eeb1..24b0e22a288e973c2cbecf2a779fe31e9e0c5fba 100644 (file)
@@ -24,7 +24,7 @@
 #include "php_string.h"
 
 /* faster, but obfuscated, all operations have a cost of 1 */
-static int fastest_levdist(const char *s1, const char *s2) 
+int fastest_levdist(const char *s1, const char *s2) 
 {
        register char *p1,*p2; 
        register int i,j,n;
index e2ad88337bea65c8e022819833d66bc17c98b4a1..9abc232581232aec08b3f4940807649cdbe649c5 100644 (file)
@@ -328,7 +328,7 @@ PHPAPI int php_printf(const char *format, ...)
 /* extended error handling function */
 static void php_error_cb(int type, const char *error_filename, const uint error_lineno, const char *format, va_list orig_args)
 {
-       char buffer[1024];
+       char buffer[1024],buf2[1024],*alt_func = NULL;
        int size = 0;
        va_list args;
        ELS_FETCH();
@@ -371,6 +371,44 @@ static void php_error_cb(int type, const char *error_filename, const uint error_
                        va_end(args);
                        buffer[sizeof(buffer) - 1] = 0;
 
+                       if(strstr(format,"Call to undefined function:")) {
+                               int dist,min,stat;
+                               char *name,*str,*p;
+                               char *string_key;
+                               ulong num_key;
+                               
+                               size = vsnprintf(buf2, sizeof(buf2) - 1, "%s", args);
+                               buf2[sizeof(buf2) - 1] = 0;
+
+                               str=estrdup(buf2);
+                               for(p=str;*p;p++)
+                                       *p=tolower(*p);                 
+
+                               min=5; 
+                               if(strlen(str)<10) min=3;
+                               if(strlen(str)<6) min=2;
+                               
+                               zend_hash_internal_pointer_reset(EG(function_table));
+                               while(1) {
+                                       stat=zend_hash_get_current_key(EG(function_table),&string_key,&num_key);
+                                       if(stat==HASH_KEY_IS_STRING)
+                                               {
+                                                       dist = fastest_levdist(str,string_key);
+                                                       if(dist<=min) {
+                                                               if(alt_func!=NULL) efree(alt_func);
+                                                               alt_func=estrdup(string_key);
+                                                               min=dist;
+                                                       } 
+                                               }
+                                       else if(stat==HASH_KEY_IS_LONG)
+                                               { /* empty */ }
+                                       else
+                                               break;
+                                       zend_hash_move_forward(EG(function_table));
+                               }
+                               efree(str);
+                       }
+
                        if (!module_initialized || PG(log_errors)) {
                                char log_buffer[1024];
 
@@ -381,6 +419,10 @@ static void php_error_cb(int type, const char *error_filename, const uint error_
 #endif
                                snprintf(log_buffer, 1024, "PHP %s:  %s in %s on line %d", error_type_str, buffer, error_filename, error_lineno);
                                php_log_err(log_buffer);
+                               if(alt_func) {
+                                       snprintf(log_buffer, 1024, "    ( maybe you were looking for %s() instead of %s() ? )",alt_func,buf2);
+                                       php_log_err(log_buffer);
+                               }
                        }
                        if (module_initialized && PG(display_errors)) {
                                char *prepend_string = INI_STR("error_prepend_string");
@@ -396,6 +438,9 @@ static void php_error_cb(int type, const char *error_filename, const uint error_
                                }
                                php_printf(error_format, error_type_str, buffer,
                                                   error_filename, error_lineno);
+                               if(alt_func) {
+                                       php_printf("&nbsp;&nbsp;&nbsp;( maybe you were looking for <b>%s()</b> instead of <b>%s()</b> ? )<br>\n",alt_func,buf2);
+                               }
                                if (append_string) {
                                        PUTS(append_string);
                                }