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 }