⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 genmenu.c

📁 VS1000B的应用文档,很好启发.大家可以
💻 C
📖 第 1 页 / 共 2 页
字号:
	"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 + -