Changeset 834
- Timestamp:
- 07/17/07 08:47:22 (1 year ago)
- Files:
-
- cherokee/trunk/ChangeLog (modified) (1 diff)
- cherokee/trunk/cherokee/avl.c (modified) (9 diffs)
- cherokee/trunk/cherokee/avl.h (modified) (1 diff)
- cherokee/trunk/cherokee/buffer.c (modified) (1 diff)
- cherokee/trunk/cherokee/buffer.h (modified) (2 diffs)
- cherokee/trunk/cherokee/connection_info.c (modified) (3 diffs)
- cherokee/trunk/cherokee/dirs_table.c (modified) (3 diffs)
- cherokee/trunk/cherokee/dirs_table.h (modified) (1 diff)
- cherokee/trunk/cherokee/encoder_table.c (modified) (3 diffs)
- cherokee/trunk/cherokee/encoder_table.h (modified) (3 diffs)
- cherokee/trunk/cherokee/exts_table.c (modified) (5 diffs)
- cherokee/trunk/cherokee/exts_table.h (modified) (1 diff)
- cherokee/trunk/cherokee/handler_common.c (modified) (2 diffs)
- cherokee/trunk/cherokee/handler_dirlist.c (modified) (2 diffs)
- cherokee/trunk/cherokee/handler_file.c (modified) (4 diffs)
- cherokee/trunk/cherokee/icons.c (modified) (4 diffs)
- cherokee/trunk/cherokee/icons.h (modified) (3 diffs)
- cherokee/trunk/cherokee/iocache.c (modified) (9 diffs)
- cherokee/trunk/cherokee/mime-protected.h (modified) (1 diff)
- cherokee/trunk/cherokee/mime.c (modified) (5 diffs)
- cherokee/trunk/cherokee/regex.c (modified) (7 diffs)
- cherokee/trunk/cherokee/server.c (modified) (1 diff)
- cherokee/trunk/cherokee/table.c (modified) (7 diffs)
- cherokee/trunk/cherokee/table.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
cherokee/trunk/ChangeLog
r833 r834 1 2007-07-16 Alvaro Lopez Ortega <alvaro@alobbs.com> 2 3 * cherokee/icons.c: Converted to use cherokee_buffer_t * instead 4 of char *. 5 6 * cherokee/avl.c (cherokee_avl_mrproper2): Added new method. 7 8 * cherokee/exts_table.c, cherokee/regex.c, cherokee/mime.c, 9 cherokee/encoder_table.c: cherokee_table_t replaced by a 10 cherokee_avl_t. 11 12 * cherokee/avl.c (cherokee_avl_get_ptr): Added new method. 13 (cherokee_avl_add_ptr): Added new method. 14 15 * cherokee/table.c (cherokee_table_add, cherokee_table_get) 16 (cherokee_table_del): Optimized to use cherokee_buffer_fake 17 instead of allocating and freeing memory. It should improve the 18 performance a little bit. 19 20 * cherokee/buffer.h (cherokee_buffer_fake): Added new method. 21 22 * cherokee/handler_common.c (stat_file): Fixed to handle 23 ret_no_sys. It's returned when the iocache reaches its limit. 24 25 * cherokee/table.c (cherokee_table_get_val): Removed. It was a 26 mitake to add that method; we should rather use 27 cherokee_table_get(). 28 29 * cherokee/exts_table.c (cherokee_exts_table_has), 30 cherokee/regex.c (cherokee_regex_table_get, _add): We shouldn't 31 use cherokee_table_get_val(). Moved to use cherokee_table_get(). 32 33 * cherokee/dirs_table.c, cherokee/dirs_table.h: This class used to 34 be based on cherokee_table. Switch to cherokee_avl in order to 35 improve the performance. 36 37 * cherokee/iocache.c: Added a new TRACE entries. 38 39 * cherokee/handler_file.c (cherokee_handler_file_init): There was 40 an invalid call to cherokee_iocache_mmap_release() that was the 41 cause of the infamous 'iocache bug' that has been bothering us for 42 a couple of weeks. As soon as I have removed it, everything began 43 to work just fine. 44 1 45 2007-07-16 Brian Rosner <brosner@gmail.com> 2 46 cherokee/trunk/cherokee/avl.c
r826 r834 73 73 cherokee_avl_init (cherokee_avl_t *avl) 74 74 { 75 avl->root = NULL; 75 avl->root = NULL; 76 avl->case_insensitive = false; 77 78 return ret_ok; 79 } 80 81 82 ret_t 83 cherokee_avl_set_case (cherokee_avl_t *avl, cherokee_boolean_t case_insensitive) 84 { 85 avl->case_insensitive = case_insensitive; 76 86 return ret_ok; 77 87 } … … 81 91 cherokee_avl_mrproper (cherokee_avl_t *avl) 82 92 { 83 return ret_ok; 93 // TODO ! 94 return ret_ok; 95 } 96 97 98 static ret_t 99 mrproper2_while (cherokee_buffer_t *key, void *value, void *param) 100 { 101 cherokee_avl_value_free_func_t free_func = param; 102 103 free_func(value); 104 return ret_ok; 105 } 106 107 ret_t 108 cherokee_avl_mrproper2 (cherokee_avl_t *avl, cherokee_avl_value_free_func_t free_func) 109 { 110 cherokee_avl_while (avl, mrproper2_while, free_func, NULL, NULL); 111 return cherokee_avl_mrproper (avl); 84 112 } 85 113 … … 87 115 static int 88 116 compare_buffers (cherokee_buffer_t *A, 89 cherokee_buffer_t *B) 117 cherokee_buffer_t *B, 118 cherokee_boolean_t case_insensitive) 90 119 { 91 120 if (A->len > B->len) … … 93 122 else if (B->len > A->len) 94 123 return - (B->len - A->len); 95 else 96 return strcmp (A->buf, B->buf); 124 else { 125 if (unlikely(case_insensitive)) 126 return strcasecmp (A->buf, B->buf); 127 else 128 return strcmp (A->buf, B->buf); 129 } 97 130 } 98 131 … … 254 287 */ 255 288 while (true) { 256 re = compare_buffers (&child->id, &node->id );289 re = compare_buffers (&child->id, &node->id, tree->case_insensitive); 257 290 258 291 if (re < 0) { … … 357 390 358 391 while (true) { 359 re = compare_buffers (key, &node->id );392 re = compare_buffers (key, &node->id, avl->case_insensitive); 360 393 if (re == 0) { 361 394 if (value) … … 516 549 517 550 while (true) { 518 re = compare_buffers (key, &node->id );551 re = compare_buffers (key, &node->id, avl->case_insensitive); 519 552 if (re == 0) { 520 553 if (value) … … 541 574 /* Commodity methods 542 575 */ 576 577 ret_t 578 cherokee_avl_get_ptr (cherokee_avl_t *avl, const char *key, void **value) 579 { 580 cherokee_buffer_t tmp_key; 581 582 cherokee_buffer_fake (&tmp_key, (const char *)key, strlen(key)); 583 return cherokee_avl_get (avl, &tmp_key, value); 584 } 585 586 587 ret_t 588 cherokee_avl_add_ptr (cherokee_avl_t *avl, const char *key, void *value) 589 { 590 cherokee_buffer_t tmp_key; 591 592 cherokee_buffer_fake (&tmp_key, (const char *)key, strlen(key)); 593 return cherokee_avl_add (avl, &tmp_key, value); 594 } 595 543 596 544 597 ret_t … … 684 737 return node_check (avl->root); 685 738 } 739 740 cherokee/trunk/cherokee/avl.h
r807 r834 39 39 typedef struct { 40 40 cherokee_avl_node_t *root; 41 cherokee_boolean_t case_insensitive; 41 42 } cherokee_avl_t; 42 43 43 44 #define AVL(a) ((cherokee_avl_t *)(a)) 44 45 45 typedef ret_t (* cherokee_avl_while_func_t) (cherokee_buffer_t *key, void *value, void *param);46 46 typedef ret_t (* cherokee_avl_while_func_t) (cherokee_buffer_t *key, void *value, void *param); 47 typedef void (* cherokee_avl_value_free_func_t) (void *param); 47 48 48 49 ret_t cherokee_avl_init (cherokee_avl_t *avl); 49 50 ret_t cherokee_avl_mrproper (cherokee_avl_t *avl); 51 ret_t cherokee_avl_mrproper2 (cherokee_avl_t *avl, cherokee_avl_value_free_func_t free_func); 50 52 53 ret_t cherokee_avl_add (cherokee_avl_t *avl, cherokee_buffer_t *key, void *value); 54 ret_t cherokee_avl_add_ptr (cherokee_avl_t *avl, const char *key, void *value); 55 ret_t cherokee_avl_del (cherokee_avl_t *avl, cherokee_buffer_t *key, void **value); 51 56 ret_t cherokee_avl_get (cherokee_avl_t *avl, cherokee_buffer_t *key, void **value); 52 ret_t cherokee_avl_add (cherokee_avl_t *avl, cherokee_buffer_t *key, void *value); 53 ret_t cherokee_avl_del (cherokee_avl_t *avl, cherokee_buffer_t *key, void **value); 57 ret_t cherokee_avl_get_ptr (cherokee_avl_t *avl, const char *key, void **value); 54 58 55 59 ret_t cherokee_avl_len (cherokee_avl_t *avl, size_t *len); 56 60 ret_t cherokee_avl_while (cherokee_avl_t *avl, cherokee_avl_while_func_t func, void *param, cherokee_buffer_t **key, void **value); 57 61 62 ret_t cherokee_avl_set_case (cherokee_avl_t *avl, cherokee_boolean_t case_sensitive); 58 63 ret_t cherokee_avl_check (cherokee_avl_t *avl); 59 64 ret_t cherokee_avl_print (cherokee_avl_t *avl); cherokee/trunk/cherokee/buffer.c
r784 r834 62 62 return ret_ok; 63 63 } 64 65 void 66 cherokee_buffer_fake (cherokee_buffer_t *buf, const char *str, cuint_t len) 67 { 68 buf->buf = (char *)str; 69 buf->len = len; 70 buf->size = len + 1; 71 } 72 64 73 65 74 ret_t cherokee/trunk/cherokee/buffer.h
r690 r834 46 46 47 47 #define BUF(x) ((cherokee_buffer_t *)(x)) 48 #define CHEROKEE_BUF_INIT {NULL, 0, 0}48 #define CHEROKEE_BUF_INIT {NULL, 0, 0} 49 49 50 50 #define cherokee_buffer_is_empty(b) (BUF(b)->len == 0) … … 53 53 #define cherokee_buffer_case_cmp_str(b,s) cherokee_buffer_case_cmp (b, s, sizeof(s)) 54 54 55 56 55 ret_t cherokee_buffer_new (cherokee_buffer_t **buf); 57 56 ret_t cherokee_buffer_free (cherokee_buffer_t *buf); 58 57 ret_t cherokee_buffer_init (cherokee_buffer_t *buf); 59 58 ret_t cherokee_buffer_mrproper (cherokee_buffer_t *buf); 59 void cherokee_buffer_fake (cherokee_buffer_t *buf, const char *str, cuint_t len); 60 60 61 61 ret_t cherokee_buffer_clean (cherokee_buffer_t *buf); cherokee/trunk/cherokee/connection_info.c
r773 r834 77 77 cherokee_connection_info_fill_up (cherokee_connection_info_t *info, cherokee_connection_t *conn) 78 78 { 79 ret_t ret; 79 80 const char *handler_name = NULL; 80 81 cherokee_icons_t *icons = CONN_SRV(conn)->icons; … … 197 198 { 198 199 char *tmp; 199 ch ar*icon;200 cherokee_buffer_t *icon; 200 201 cherokee_buffer_t name = CHEROKEE_BUF_INIT; 201 202 … … 210 211 cherokee_buffer_move_to_begin (&name, tmp - name.buf); 211 212 212 cherokee_icons_get_icon (icons, name.buf, &icon);213 if ( icon != NULL)214 cherokee_buffer_add (&info->icon, icon, strlen(icon));213 ret = cherokee_icons_get_icon (icons, &name, &icon); 214 if (ret == ret_ok) 215 cherokee_buffer_add_buffer (&info->icon, icon); 215 216 216 217 cherokee_buffer_mrproper (&name); cherokee/trunk/cherokee/dirs_table.c
r690 r834 41 41 cherokee_dirs_table_init (cherokee_dirs_table_t *pt) 42 42 { 43 return cherokee_ table_init (pt);43 return cherokee_avl_init (pt); 44 44 } 45 45 46 47 static ret_t 48 mrproper_each (cherokee_buffer_t *key, void *value, void *param) 49 { 50 cherokee_config_entry_free (CONF_ENTRY(value)); 51 return ret_ok; 52 } 46 53 47 54 ret_t 48 55 cherokee_dirs_table_mrproper (cherokee_dirs_table_t *pt) 49 56 { 50 return cherokee_table_mrproper2 ( 51 TABLE(pt), 52 (cherokee_table_free_item_t) cherokee_config_entry_free); 57 cherokee_avl_while (AVL(pt), 58 mrproper_each, 59 NULL, NULL, NULL); 60 return cherokee_avl_mrproper (AVL(pt)); 53 61 } 54 62 … … 65 73 66 74 do { 67 ret = cherokee_ table_get (pt, web_directory->buf, (void **)&entry);75 ret = cherokee_avl_get (AVL(pt), web_directory, (void **)&entry); 68 76 69 77 /* Found … … 155 163 } 156 164 157 ret = cherokee_ table_get (table, key.buf, &parent);165 ret = cherokee_avl_get (table, &key, &parent); 158 166 if (ret == ret_ok) { 159 167 entry->parent = parent; cherokee/trunk/cherokee/dirs_table.h
r690 r834 27 27 28 28 #include "common.h" 29 #include " table.h"29 #include "avl.h" 30 30 #include "config_entry.h" 31 31 32 32 33 typedef cherokee_ table_t cherokee_dirs_table_t; /* Web_directory -> config_entry */33 typedef cherokee_avl_t cherokee_dirs_table_t; /* Web_directory -> config_entry */ 34 34 #define DTABLE(x) ((cherokee_dirs_table_t *)(x)) 35 35 cherokee/trunk/cherokee/encoder_table.c
r597 r834 32 32 cherokee_encoder_table_init (cherokee_encoder_table_t *et) 33 33 { 34 return cherokee_ table_init (et);34 return cherokee_avl_init (et); 35 35 } 36 36 … … 39 39 cherokee_encoder_table_mrproper (cherokee_encoder_table_t *et) 40 40 { 41 return cherokee_ table_mrproper2 (et, (cherokee_table_free_item_t)42 cherokee_encoder_table_entry_free);41 return cherokee_avl_mrproper2 (et, (cherokee_table_free_item_t) 42 cherokee_encoder_table_entry_free); 43 43 } 44 44 45 45 46 46 ret_t 47 cherokee_encoder_table_set (cherokee_encoder_table_t *et, ch ar*encoder, cherokee_encoder_table_entry_t *entry)47 cherokee_encoder_table_set (cherokee_encoder_table_t *et, cherokee_buffer_t *encoder, cherokee_encoder_table_entry_t *entry) 48 48 { 49 return cherokee_ table_add (et, encoder, entry);49 return cherokee_avl_add (et, encoder, entry); 50 50 } 51 51 … … 54 54 cherokee_encoder_table_get (cherokee_encoder_table_t *et, char *encoder, cherokee_encoder_table_entry_t **entry) 55 55 { 56 return cherokee_ table_get(et, encoder, (void **)entry);56 return cherokee_avl_get_ptr (et, encoder, (void **)entry); 57 57 } 58 58 cherokee/trunk/cherokee/encoder_table.h
r597 r834 28 28 #include "common-internal.h" 29 29 30 #include " table.h"30 #include "avl.h" 31 31 #include "encoder.h" 32 32 #include "matching_list.h" … … 39 39 40 40 41 typedef cherokee_ table_t cherokee_encoder_table_t;41 typedef cherokee_avl_t cherokee_encoder_table_t; 42 42 #define ETABLE(x) ((cherokee_encoder_table_t *)(x)) 43 43 … … 48 48 ret_t cherokee_encoder_table_mrproper (cherokee_encoder_table_t *et); 49 49 50 ret_t cherokee_encoder_table_set (cherokee_encoder_table_t *et, cherokee_buffer_t *encoder, cherokee_encoder_table_entry_t *entry); 50 51 ret_t cherokee_encoder_table_get (cherokee_encoder_table_t *et, char *encoder, cherokee_encoder_table_entry_t **entry); 51 ret_t cherokee_encoder_table_set (cherokee_encoder_table_t *et, char *encoder, cherokee_encoder_table_entry_t *entry);52 52 ret_t cherokee_encoder_table_new_encoder (cherokee_encoder_table_t *et, char *encoder, char *ext, cherokee_encoder_t **new_encoder); 53 53 cherokee/trunk/cherokee/exts_table.c
r597 r834 33 33 ret_t ret; 34 34 35 ret = cherokee_ table_init(&et->table);35 ret = cherokee_avl_init(&et->avl); 36 36 if (unlikely (ret != ret_ok)) return ret; 37 37 … … 46 46 { 47 47 cherokee_list_content_free (&et->list, (cherokee_list_free_func) cherokee_config_entry_free); 48 cherokee_ table_mrproper (&et->table);48 cherokee_avl_mrproper (&et->avl); 49 49 50 50 return ret_ok; … … 61 61 if (dot == NULL) return ret_not_found; 62 62 63 ret = cherokee_ table_get (&et->table, dot+1, (void **)&entry);63 ret = cherokee_avl_get_ptr (&et->avl, dot+1, (void **)&entry); 64 64 if (ret != ret_ok) return ret; 65 65 … … 90 90 * plugin entry object. 91 91 */ 92 TRACE ("ADD: et %p table %p ext %s\n", et, &et->table, ext);92 TRACE ("ADD: et %p avl %p ext %s\n", et, &et->avl, ext); 93 93 94 return cherokee_ table_add (&et->table, ext, plugin_entry);94 return cherokee_avl_add_ptr (&et->avl, ext, plugin_entry); 95 95 } 96 96 … … 98 98 cherokee_exts_table_has (cherokee_exts_table_t *et, char *ext) 99 99 { 100 return (cherokee_table_get_val (&et->table, ext) == NULL) ? ret_not_found : ret_ok; 100 void *foo; 101 return cherokee_avl_get_ptr (&et->avl, ext, &foo); 101 102 } cherokee/trunk/cherokee/exts_table.h
r597 r834 30 30 #include "config_entry.h" 31 31 #include "list.h" 32 #include " table.h"32 #include "avl.h" 33 33 34 34 35 35 typedef struct { 36 cherokee_ table_t table;36 cherokee_avl_t avl; 37 37 cherokee_list_t list; 38 38 } cherokee_exts_table_t; cherokee/trunk/cherokee/handler_common.c
r827 r834 104 104 int re = -1; 105 105 106 /* Without cache107 */108 if (!useit) {109 re = cherokee_stat (path->buf, nocache_info);110 111 TRACE (ENTRIES, "%s, use_iocache=%d re=%d\n", path->buf, useit, re);112 113 if (re < 0) {114 switch (errno) {115 case ENOENT:116 return ret_not_found;117 case EACCES:118 return ret_deny;119 default:120 return ret_error;121 }122 }123 124 *info = nocache_info;125 return ret_ok;126 }127 128 106 /* I/O cache 129 107 */ 130 108 #ifndef CHEROKEE_EMBEDDED 131 ret = cherokee_iocache_get_or_create_w_stat (iocache, path, io_entry); 132 133 TRACE (ENTRIES, "%s, use_iocache=%d re=%d\n", path->buf, useit, re); 134 135 if (ret != ret_ok) { 109 if (useit) { 110 ret = cherokee_iocache_get_or_create_w_stat (iocache, path, io_entry); 111 TRACE (ENTRIES, "%s, use_iocache=1 rer=%d\n", path->buf, ret); 112 136 113 switch (ret) { 114 case ret_ok: 115 *info = &(*io_entry)->state; 116 return ret_ok; 117 137 118 case ret_not_found: 138 119 return ret_not_found; 120 121 case ret_no_sys: 122 goto without; 139 123 case ret_deny: 140 124 return ret_deny; … … 142 126 return ret_error; 143 127 } 144 } 145 146 *info = &(*io_entry)->state; 147 return ret_ok; 148 #endif 128 129 } 130 #endif 131 132 133 /* Without cache 134 */ 135 without: 136 re = cherokee_stat (path->buf, nocache_info); 137 TRACE (ENTRIES, "%s, use_iocache=0 re=%d\n", path->buf, re); 138 139 if (re >= 0) { 140 *info = nocache_info; 141 return ret_ok; 142 } 143 144 switch (errno) { 145 case ENOENT: 146 return ret_not_found; 147 case EACCES: 148 return ret_deny; 149 default: 150 return ret_error; 151 } 149 152 150 153 return ret_error; cherokee/trunk/cherokee/handler_dirlist.c
r597 r834 738 738 render_file (cherokee_handler_dirlist_t *dhdl, cherokee_buffer_t *buffer, file_entry_t *file) 739 739 { 740 ret_t ret; 740 741 cherokee_boolean_t is_dir; 741 742 cherokee_buffer_t *vtmp[2]; 742 743 char *alt = NULL; 743 ch ar*icon = NULL;744 cherokee_buffer_t *icon = NULL; 744 745 char *name = (char *) &file->info.d_name; 745 746 cherokee_icons_t *icons = HANDLER_SRV(dhdl)->icons; … … 762 763 if (icons != NULL) { 763 764 if (is_dir) { 764 icon = icons->directory_icon.buf;765 icon = &icons->directory_icon; 765 766 } else { 766 cherokee_icons_get_icon (icons, name, &icon); 767 if (icon == NULL) icon = "blank.png"; 767 cherokee_buffer_t name_buf; 768 769 cherokee_buffer_fake (&name_buf, name, strlen(name)); 770 ret = cherokee_icons_get_icon (icons, &name_buf, &icon); 771 if (ret != ret_ok) 772 icon = "blank.png"; 768 773 } 769 774 } cherokee/trunk/cherokee/handler_file.c
r824 r834 319 319 if (HDL_FILE_PROP(fhdl)->use_cache) { 320 320 ret = cherokee_iocache_get_or_create_w_stat (srv->iocache, &conn->local_directory, io_entry); 321 TRACE (ENTRIES, "%s, use_iocache=1 ret=%d\n", conn->local_directory.buf, ret); 322 321 323 switch (ret) { 322 324 case ret_ok: … … 345 347 without: 346 348 re = stat (conn->local_directory.buf, &fhdl->cache_info); 349 TRACE (ENTRIES, "%s, use_iocache=0 ret=%d\n", conn->local_directory.buf, re); 350 347 351 if (re >= 0) { 348 352 *info = &fhdl->cache_info; … … 421 425 */ 422 426 #ifndef CHEROKEE_EMBEDDED 423 use_io = (( HDL_FILE_PROP(fhdl)->use_cache) &&424 ( conn->encoder == NULL) &&427 use_io = ((conn->encoder == NULL) && 428 (HDL_FILE_PROP(fhdl)->use_cache) && 425 429 (conn->socket.is_tls == non_TLS) && 426 430 (fhdl->info->st_size <= IOCACHE_MAX_FILE_SIZE) && … … 431 435 432 436 if (use_io) { 433 if (conn->io_entry_ref)434 cherokee_iocache_mmap_release (srv->iocache, conn->io_entry_ref);435 437 ret = cherokee_iocache_get_or_create_w_mmap (srv->iocache, 436 438 &conn->local_directory, cherokee/trunk/cherokee/icons.c
r597 r834 38 38 CHEROKEE_NEW_STRUCT(n, icons); 39 39 40 ret = cherokee_ table_init_case(&n->files);40 ret = cherokee_avl_init (&n->files); 41 41 if (unlikely(ret < ret_ok)) return ret; 42 42 43 ret = cherokee_ table_init (&n->files_matching);43 ret = cherokee_avl_init (&n->files_matching); 44 44 if (unlikely(ret < ret_ok)) return ret; 45 45 46 ret = cherokee_ table_init_case(&n->suffixes);46 ret = cherokee_avl_init (&n->suffixes); 47 47 if (unlikely(ret < ret_ok)) return ret; 48 48 49 /* Files and Suffixes are case insensitive 50 */ 51 cherokee_avl_set_case (&n->files, true); 52 cherokee_avl_set_case (&n->suffixes, true); 53 54 /* Defaults 55 */ 49 56 cherokee_buffer_init (&n->default_icon); 50 57 cherokee_buffer_init (&n->directory_icon); … … 56 63 57 64 65 static void 66 free_entry (void *param) 67 { 68 cherokee_buffer_free (BUF(param)); 69 } 70 71 58 72 ret_t 59 73 cherokee_icons_free (cherokee_icons_t *icons) 60 74 { 61 /* TODO: Set a free_item function.62 */ 63 cherokee_ table_mrproper2 (&icons->files, free);64 cherokee_ table_mrproper2 (&icons->suffixes, free);65 cherokee_ table_mrproper2 (&icons->files_matching, free);75 /* It stores buffers as values, 76 */ 77 cherokee_avl_mrproper2 (&icons->files, free_entry); 78 cherokee_avl_mrproper2 (&icons->suffixes, free_entry); 79 cherokee_avl_mrproper2 (&icons->files_matching, free_entry); 66 80 67 81 cherokee_buffer_mrproper (&icons->default_icon); … … 75 89 76 90 ret_t 77 cherokee_icons_add_file (cherokee_icons_t *icons, cherokee_buffer_t *icon, const char *file) 78 { 79 if ((strchr(file, '*') != NULL) || 80 (strchr(file, '?') != NULL)) 91 cherokee_icons_add_file (cherokee_icons_t *icons, cherokee_buffer_t *icon, cherokee_buffer_t *file) 92 { 93 ret_t ret; 94 cherokee_buffer_t *tmp = NULL; 95 96 ret = cherokee_buffer_dup (icon, &tmp); 97 if (unlikely (ret != ret_ok)) return ret; 98 99 if ((strchr (file->buf, '*') != NULL) || 100 (strchr (file->buf, '?') != NULL)) 81 101 { 82 cherokee_table_add (&icons->files_matching, (char *)file, strdup(icon->buf)); 102 return cherokee_avl_add (&icons->files_matching, file, tmp); 103 } 104 105 return cherokee_avl_add (&icons->files, file, tmp); 106 } 107 108 109 ret_t 110 cherokee_icons_add_suffix (cherokee_icons_t *icons, cherokee_buffer_t *icon, cherokee_buffer_t *suffix) 111 { 112 ret_t ret; 113 cherokee_buffer_t *tmp = NULL; 114 115 ret = cherokee_buffer_dup (icon, &tmp); 116 if (unlikely (ret != ret_ok)) return ret; 117 118 cherokee_avl_add (&icons->suffixes, suffix, tmp); 119 return ret_ok; 120 } 121 122 123 ret_t 124 cherokee_icons_set_directory (cherokee_icons_t *icons, cherokee_buffer_t *icon) 125 { 126 cherokee_buffer_clean (&icons->directory_icon); 127 return cherokee_buffer_add_buffer (&icons->directory_icon, icon); 128 } 129 130 131 ret_t 132 cherokee_icons_set_parentdir (cherokee_icons_t *icons, cherokee_buffer_t *icon) 133 { 134 cherokee_buffer_clean (&icons->parentdir_icon); 135 return cherokee_buffer_add_buffer (&icons->parentdir_icon, icon); 136 } 137 138 139 ret_t 140 cherokee_icons_set_default (cherokee_icons_t *icons, cherokee_buffer_t *icon) 141 { 142 cherokee_buffer_clean (&icons->default_icon); 143 return cherokee_buffer_add_buffer (&icons->default_icon, icon); 144 } 145 146 147 ret_t 148 match_file (cherokee_buffer_t *key, void *value, void *param) 149 { 150 ret_t ret; 151 cherokee_buffer_t *param_file = param; 152 153 ret = cherokee_wildcard_match (key->buf, param_file->buf); 154 if (ret == ret_ok) 155 return ret_deny; 156 157 return ret_ok; 158 } 159 160 161 ret_t 162 cherokee_icons_get_icon (cherokee_icons_t *icons, 163 cherokee_buffer_t *file, 164 cherokee_buffer_t **icon_ret) 165 { 166 ret_t ret; 167 char *suffix; 168 169 /* Look for the filename 170 */ 171 ret = cherokee_avl_get (&icons->files, file, (void **)icon_ret); 172 if (ret == ret_ok) return ret_ok; 173 174 /* Look for the suffix 175 */ 176 suffix = strrchr (file->buf, '.'); 177 if (suffix != NULL) { 178 ret = cherokee_avl_get_ptr (&icons->suffixes, suffix+1, (void **)icon_ret); 179 if (ret == ret_ok) return ret_ok; 180 } 181 182 /* Look for the wildcat matching 183 */ 184 ret = cherokee_avl_while (&icons->files_matching, match_file, 185 file, NULL, (void **)icon_ret); 186 if (ret == ret_ok) return ret_ok; 187 188 /* Default one 189 */ 190 if (! cherokee_buffer_is_empty (&icons->default_icon)) { 191 *icon_ret = &icons->default_icon; 83 192 return ret_ok; 84 193 } 85 86 cherokee_table_add (&icons->files, (char *)file, strdup(icon->buf)); 87 return ret_ok; 88 } 89 90 91 ret_t 92 cherokee_icons_add_suffix (cherokee_icons_t *icons, cherokee_buffer_t *icon, const char *suffix) 93 { 94 cherokee_table_add (&icons->suffixes, (char *)suffix, strdup(icon->buf)); 95 return ret_ok; 96 } 97 98 99 ret_t 100 cherokee_icons_set_directory (cherokee_icons_t *icons, cherokee_buffer_t *icon) 101 { 102 cherokee_buffer_clean (&icons->directory_icon); 103 cherokee_buffer_add_buffer (&icons->directory_icon, icon); 104 return ret_ok; 105 } 106 107 108 ret_t 109 cherokee_icons_set_parentdir (cherokee_icons_t *icons, cherokee_buffer_t *icon) 110 { 111 cherokee_buffer_clean (&icons->parentdir_icon); 112 cherokee_buffer_add_buffer (&icons->parentdir_icon, icon); 113 return ret_ok; 114 } 115 116 117 ret_t 118 cherokee_icons_set_default (cherokee_icons_t *icons, cherokee_buffer_t *icon) 119 { 120 cherokee_buffer_clean (&icons->default_icon); 121 cherokee_buffer_add_buffer (&icons->default_icon, icon); 122 return ret_ok; 123 } 124 125 126 static int 127 match_file (const char *pattern, 128 void *icon, 129 void *param_file) 130 { 131 ret_t ret; 132 133 ret = cherokee_wildcard_match (pattern, (char *)param_file); 134 return (ret == ret_ok); 135 } 136 137 138 ret_t 139 cherokee_icons_get_icon (cherokee_icons_t *icons, char *file, char **icon_ret) 140 { 141 ret_t ret; 142 char *suffix, *match_string; 143 144 /* Look for the filename 145 */ 146 ret = cherokee_table_get (&icons->files, file, (void **)icon_ret); 147 if (ret == ret_ok) return ret_ok; 148 149 /* Look for the suffix 150 */ 151 suffix = strrchr (file, '.'); 152 if (suffix != NULL) { 153 ret = cherokee_table_get (&icons->suffixes, suffix+1, (void **)icon_ret); 154 if (ret == ret_ok) return ret_ok; 155 } 156 157 /* Look for the wildcat matching 158 */ 159 ret = cherokee_table_while (&icons->files_matching, match_file, 160 file, &match_string, (void **)icon_ret); 161 if (ret == ret_ok) return ret_ok; 162 163 /* Default one 164 */ 165 if (icons->default_icon.len > 0) { 166 *icon_ret = icons->default_icon.buf; 167 } 168 169 return ret_ok; 194 195 return ret_not_found; 170 196 } 171 197 … … 174 200 add_file (char *file, void *data) 175 201 { 202 cherokee_buffer_t file_buf; 203 cherokee_icons_t *icons = ((void **)data)[0]; 204 cherokee_buffer_t *key = ((void **)data)[1]; 205 206 TRACE(ENTRIES, "Adding file icon '%s' -> '%s'\n", key->buf, file); 207 208 cherokee_buffer_fake (&file_buf, file, strlen(file)); 209 return cherokee_icons_add_file (icons, key, &file_buf); 210 } 211 212 static ret_t 213 add_suffix (char *file, void *data) 214 { 215 cherokee_buffer_t file_buf; 176 216 cherokee_icons_t *icons = ((void **)data)[0]; 177 217 cherokee_buffer_t *key = ((void **)data)[1]; 178 179 TRACE(ENTRIES, "Adding file icon '%s' -> '%s'\n", key->buf, file);180 181 return cherokee_icons_add_file (icons, key, file);182 }183 184 static ret_t185 add_suffix (char *file, void *data)186 {187 cherokee_icons_t *icons = ((void **)data)[0];188 cherokee_buffer_t *key = ((void **)data)[1];189 218 190 219 TRACE(ENTRIES, "Adding suffix icon '%s' -> '%s'\n", key->buf, file); 191 220 192 return cherokee_icons_add_suffix (icons, key, file); 221 cherokee_buffer_fake (&file_buf, file, strlen(file)); 222 return cherokee_icons_add_suffix (icons, key, &file_buf); 193 223 } 194 224 cherokee/trunk/cherokee/icons.h
r597 r834 27 27 28 28 #include "common.h" 29 #include " table.h"29 #include "avl.h" 30 30 #include "list.h" 31 31 #include "buffer.h" … … 34 34 35 35 typedef struct { 36 cherokee_ table_tfiles;37 cherokee_ table_tsuffixes;38 cherokee_ table_tfiles_matching;36 cherokee_avl_t files; 37 cherokee_avl_t suffixes; 38 cherokee_avl_t files_matching; 39 39 40 40 cherokee_buffer_t default_icon; … … 51 51 52 52 ret_t cherokee_icons_configure (cherokee_icons_t *icons, cherokee_config_node_t *config); 53 ret_t cherokee_icons_get_icon (cherokee_icons_t *icons, ch ar *file, char**icon);53 ret_t cherokee_icons_get_icon (cherokee_icons_t *icons, cherokee_buffer_t *file, cherokee_buffer_t **icon); 54 54