📄 genmenu.c
字号:
"Bookmark 8", {0,0},{0,0}, {0,0},{0,7}, ":\0\0\7" }, {/*40*/ "\0\0", "\0\0", 0, 0, "Bookmark 9", {0,0},{0,0}, {0,0},{0,8}, ":\0\0\x8" }, {/*41*/ "\0\0", "\0\0", 0, 0, "Bookmark 10", {0,0},{0,0}, {0,0},{0,9}, ":\0\0\x9" }, {/*42*/ "\0\0", "\0\0", 0, 0, "Bookmark 11", {0,0},{0,0}, {0,0},{0,10}, ":\0\0\xa" }, {/*43*/ "\0\0", "\0\0", 0, 0, "Bookmark 12", {0,0},{0,0}, {0,0},{0,11}, ":\0\0\xb" }, {/*44*/ "\0\0", "\0\0", 0, 0, "Bookmark 13", {0,0},{0,0}, {0,0},{0,12}, ":\0\0\xc" }, {/*45*/ "\0\0", "\0\0", 0, 0, "Bookmark 14", {0,0},{0,0}, {0,0},{0,13}, ":\0\0\xd" }, {/*46*/ "\0\0", "\0\0", 0, 0, "Bookmark 15", {0,0},{0,0}, {0,0},{0,14}, ":\0\0\xe" }, {/*47*/ "\0\0", "\0\0", 0, 0, "Bookmark 16", {0,0},{0,0}, {0,0},{0,15}, ":\0\0\xf" }, {/*48*/ "\0\0", "\0\0", 0, 0, "Bookmark 17", {0,0},{0,0}, {0,0},{0,16}, ":\0\0\x10" }, {/*49*/ "\0\0", "\0\0", 0, 0, "Bookmark 18", {0,0},{0,0}, {0,0},{0,17}, ":\0\0\x11" }, {/*50*/ "\0\0", "\0\0", 0, 0, "Bookmark 19", {0,0},{0,0}, {0,0},{0,18}, ":\0\0\x12" }, {/*51*/ "\0\0", "\0\0", 0, 0, "Bookmark 20", {0,0},{0,0}, {0,0},{0,19}, ":\0\0\x13" }, {/*52*/ "\0\0", "\0\0", 0, 0, "Bookmark 21", {0,0},{0,0}, {0,0},{0,20}, ":\0\0\x14" }, {/*53*/ "\0\0", "\0\0", 0, 0, "Bookmark 22", {0,0},{0,0}, {0,0},{0,21}, ":\0\0\x15" }, {/*54*/ "\0\0", "\0\0", 0, 0, "Bookmark 23", {0,0},{0,0}, {0,0},{0,22}, ":\0\0\x16" }, {/*55*/ "\0\0", "\0\0", 0, 0, "Bookmark 24", {0,0},{0,0}, {0,0},{0,23}, ":\0\0\x17" }, {/*56*/ "\0\0", "\0\0", 0, 0, "Bookmark 25", {0,0},{0,0}, {0,0},{0,24}, ":\0\0\x18" }, {/*57*/ "\0\0", "\0\0", 0, 0, "Bookmark 26", {0,0},{0,0}, {0,0},{0,25}, ":\0\0\x19" }, {/*58*/ "\0\0", "\0\0", 0, MFLG_LAST, "Bookmark 27", {0,0},{0,0}, {0,0},{0,26}, ":\0\0\x1a" }};#endifstruct MenuTemp;struct MenuTemp { char menuName[80]; //ubyte parent[2]; /*(0 parent index: 0 or 1..65535) */ //ubyte subtree[2]; /*1 subtree index: 0 or 1..65535 */ char subMenu[80]; int subTree; int parent; ubyte extra; /*2 number of extra files to play */ ubyte flags; /*2 flags for this entry */ ubyte name[80]; /*3 entry name (for display) */ double startTime; double endTime; ubyte fileName[80]; /*28 FAT short filename, .ogg implied */};struct MenuTemp menuTemp[65536] = {0};int menuTempNum = 0;int main(int argc, char *argv[]) {#if 0 fwrite(menu, 1, sizeof(menu), stdout); return 0;#else FILE *fp = fopen((argc > 1) ? argv[1] : "menu.txt", "r"); char line[200], lnum = 0, err = 0; struct MenuTemp *m = &menuTemp[0]; if (!fp) { fprintf(stderr, "Could not open menu.txt for reading\n"); exit(10); } while (fgets(line, 200, fp)) { int l = strlen(line); char *p = line; lnum++; while (l && isspace(line[l-1])) line[--l] = '\0'; while (*p && isspace(*p)) p++; if (*p == 0 || *p == '#') continue; if (!strncmp(p, "--", 2)) { char *e = p += 2; if (menuTempNum) { (m-1)->flags |= MFLG_LAST; if (!strncmp(e, "end--", 5)) (m-1)->flags |= MFLG_ENDPLAY; } m->flags |= MFLG_FIRST; while (*e && strncmp(e, "--", 2)) e++; *e = '\0'; strcpy(m->menuName, p); /*the first entry has the menu name*/ } else { int name = 1, submenu = 0, file = 0, timer = 0, bookmark = 0, start = 0; while (*p) { int escaped = 0; char *e, str[200], *t = str; while (*p && isspace(*p)) p++; e = p; while (*e) { if (!escaped && isspace(*e)) break; if (*e == '\"') { escaped ^= 1; } else { *t++ = *e; } e++; } p = e; *t = '\0'; if (!strcmp(str, "submenu")) { submenu = 1; } else if (!strcmp(str, "entry")) { submenu = 2; } else if (!strcmp(str, "autoplay")) { strcpy(m->fileName, "AUTOPLAY"); } else if (!strcmp(str, "file")) { file = 1; } else if (!strcmp(str, "timer")) { timer = 1; } else if (!strcmp(str, "bookmark")) { bookmark = 1; } else if (!strcmp(str, "useend")) { m->flags |= MFLG_USEENDTIME; } else if (!strcmp(str, "end")) { m->endTime = 32767.999999; } else { if (name) { //printf("name %s\n", str); strcpy(m->name, str); name = 0; } else if (submenu) { //printf("submenu %s\n", str); strcpy(m->subMenu, str); if (submenu == 2) { m->flags |= MFLG_USEENDTIME; } submenu = 0; } else if (file == 1) { /*TODO: uppercase*/ //printf("file %s\n", str); strcpy(m->fileName, str); file = 0; } else { double tim = 0; e = str; more: tim += strtod(e, &e); if (*e == ':') { e++; tim *= 60; goto more; } if (*e) { fprintf(stderr, "unknown command '%s'\n", e); err++; } if (timer) { //printf("timer %f\n", tim); m->fileName[0] = '!'; m->fileName[1] = 0; m->fileName[2] = (int)tim >> 8; m->fileName[3] = (int)tim & 255; timer = 0; } else if (bookmark) { //printf("bookmark %f\n", tim); m->fileName[0] = ':'; m->fileName[1] = 0; m->fileName[2] = (int)tim >> 8; m->fileName[3] = (int)tim & 255; bookmark = 0; } else { if (start) { //printf("endtime %f %s\n", tim, e); m->endTime = tim; } else { //printf("startime %f %s\n", tim, e); m->startTime = tim; start = 1; } } } } if (escaped) { fprintf(stderr, "Runaway \" in line %d\n", lnum); err++; } } //printf("\n"); menuTempNum++; m++; } } fclose(fp); if (argc > 2) { fp = fopen(argv[2], "wb"); if (!fp) { fprintf(stderr, "Could not open %s for writing\n", argv[2]); exit(10); } } else { fp = stdout; } if (!err) { int i; /* resolve submenu references */ m = &menuTemp[0]; for (i=0;i<menuTempNum;i++) { if (m->subMenu[0]) { int j; struct MenuTemp *c = &menuTemp[0]; for (j=0;j<menuTempNum;j++) { if ((m->flags & MFLG_USEENDTIME) && !strcmp(m->subMenu, c->name)) { /*c->parent = i; parent not used in playlist mode*/ m->subTree = j; strcpy(m->fileName, c->fileName); break; } else if (!strcmp(m->subMenu, c->menuName)) { struct MenuTemp *d = c; //&menuTemp[j]; int k = j; m->subTree = j; while (1) { d->parent = i; k++; if (d->flags & MFLG_LAST) break; d++; if (k >= menuTempNum) { err++; fprintf(stderr, "Termination missing in menu \"%s\"\n", m->subMenu); break; } } break; } c++; } if (j == menuTempNum) { err++; fprintf(stderr, "Could not find submenu \"%s\"\n", m->subMenu); } } m++; } } if (!err) { int i; /* resolve submenu references */ m = &menuTemp[0]; for (i=0;i<menuTempNum;i++) { struct ENTRY entry; memset(&entry, 0, sizeof(entry)); entry.parent[0] = m->parent >> 8; entry.parent[1] = m->parent & 255; /*used again*/ entry.subtree[0] = m->subTree>>8; entry.subtree[1] = m->subTree & 255; entry.extra = 0; entry.flags = m->flags; //fprintf(stderr, "flags %d\n", m->flags); if (strlen(m->name) < 42) { strcpy(entry.name, m->name); } else { strncpy(entry.name, m->name, 42); entry.name[41] = '\0'; err++; fprintf(stderr, "Too long menu entry name \"%s\"\n", m->name); } { long t = (long)(m->startTime * 65536); int s = (t >> 16), f = (t & 65535); entry.startFraction[0] = f>>8; entry.startFraction[1] = f & 255; entry.startSeconds[0] = s>>8; entry.startSeconds[1] = s & 255; } { long t = (long)(m->endTime * 65536); int s = (t >> 16), f = (t & 65535); entry.endFraction[0] = f>>8; entry.endFraction[1] = f & 255; entry.endSeconds[0] = s>>8; entry.endSeconds[1] = s & 255; } if (strlen(m->fileName) <= 8) { int c = 0; while (c < 8) { if (m->fileName[0] != ':' && m->fileName[0] != '!' && m->fileName[c] == '\0') break; entry.fileName[c] = toupper(m->fileName[c]); c++; } while (c < 8) { entry.fileName[c] = ' '; c++; } } else { err++; fprintf(stderr, "Too long file name \"%s\"\n", m->fileName); } fwrite(&entry, 1, sizeof(entry), fp); fflush(fp); m++; } } if (fp != stdout) fclose(fp); return err;#endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -