Mercurial > repos > blastem
comparison menu.c @ 868:1bab7e01ae98
Allow directory navigation in menu. Sort directory entries
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 06 Nov 2015 14:17:41 -0800 |
parents | 69a6ec208111 |
children | f173317ecdb4 |
comparison
equal
deleted
inserted
replaced
867:bacd67a82d58 | 868:1bab7e01ae98 |
---|---|
15 //in the current implementation, the operations happen instantly | 15 //in the current implementation, the operations happen instantly |
16 //in emulated time so we can always return 0 | 16 //in emulated time so we can always return 0 |
17 return 0; | 17 return 0; |
18 } | 18 } |
19 | 19 |
20 int menu_dir_sort(const void *a, const void *b) | |
21 { | |
22 const dir_entry *da, *db; | |
23 da = a; | |
24 db = b; | |
25 if (da->is_dir != db->is_dir) { | |
26 return db->is_dir - da->is_dir; | |
27 } | |
28 return strcasecmp(((dir_entry *)a)->name, ((dir_entry *)b)->name); | |
29 } | |
30 | |
20 void * menu_write_w(uint32_t address, void * context, uint16_t value) | 31 void * menu_write_w(uint32_t address, void * context, uint16_t value) |
21 { | 32 { |
22 m68k_context *m68k = context; | 33 m68k_context *m68k = context; |
23 genesis_context *gen = m68k->system; | 34 genesis_context *gen = m68k->system; |
24 menu_context *menu = gen->extra; | 35 menu_context *menu = gen->extra; |
31 switch (address >> 2) | 42 switch (address >> 2) |
32 { | 43 { |
33 case 0: { | 44 case 0: { |
34 size_t num_entries; | 45 size_t num_entries; |
35 dir_entry *entries = get_dir_list(menu->curpath, &num_entries); | 46 dir_entry *entries = get_dir_list(menu->curpath, &num_entries); |
47 if (entries) { | |
48 qsort(entries, num_entries, sizeof(dir_entry), menu_dir_sort); | |
49 } | |
50 uint8_t *dest; | |
36 for (size_t i = 0; i < num_entries; i++) | 51 for (size_t i = 0; i < num_entries; i++) |
37 { | 52 { |
38 uint8_t *dest = get_native_pointer(dst, (void **)m68k->mem_pointers, &m68k->options->gen); | 53 dest = get_native_pointer(dst, (void **)m68k->mem_pointers, &m68k->options->gen); |
39 if (!dest) { | 54 if (!dest) { |
40 break; | 55 break; |
41 } | 56 } |
42 *(dest++) = entries[i].is_dir; | 57 *(dest++) = entries[i].is_dir; |
43 *(dest++) = 1; | 58 *(dest++) = 1; |
67 *(dest++) = 0; | 82 *(dest++) = 0; |
68 *dest = 0; | 83 *dest = 0; |
69 dst += 2; | 84 dst += 2; |
70 } | 85 } |
71 } | 86 } |
72 free_dir_list(entries, num_entries); | 87 //terminate list |
88 dest = get_native_pointer(dst, (void **)m68k->mem_pointers, &m68k->options->gen); | |
89 if (dest) { | |
90 *dest = dest[1] = 0; | |
91 free_dir_list(entries, num_entries); | |
92 } | |
93 break; | |
94 } | |
95 case 1: { | |
96 char buf[4096]; | |
97 char *cur; | |
98 char * dest = NULL; | |
99 for (cur = buf; cur < buf+sizeof(buf); cur+=2, dst+=2, dest+=2) | |
100 { | |
101 if (!dest || !(dst & 0xFFFF)) { | |
102 //we may have walked off the end of a memory block, get a fresh native pointer | |
103 dest = get_native_pointer(dst, (void **)m68k->mem_pointers, &m68k->options->gen); | |
104 if (!dest) { | |
105 break; | |
106 } | |
107 } | |
108 *cur = dest[1]; | |
109 cur[1] = *dest; | |
110 if (!*dest || !dest[1]) { | |
111 break; | |
112 } | |
113 } | |
114 char *pieces[] = {menu->curpath, "/", buf}; | |
115 menu->curpath = alloc_concat_m(3, pieces); | |
116 free(pieces[0]); | |
73 break; | 117 break; |
74 } | 118 } |
75 default: | 119 default: |
76 fprintf(stderr, "WARNING: write to undefined menu port %X\n", address); | 120 fprintf(stderr, "WARNING: write to undefined menu port %X\n", address); |
77 } | 121 } |