[Toxine-cvs] CVS: toxine/src commands.c,1.20,1.21 common.h,1.6,1.7 playlist.c,1.3,1.4 utils.c,1.5,1.
Brought to you by:
f1rmb
From: Daniel Caujolle-B. <f1...@us...> - 2002-07-19 21:03:58
|
Update of /cvsroot/toxine/toxine/src In directory usw-pr-cvs1:/tmp/cvs-serv15599/src Modified Files: commands.c common.h playlist.c utils.c Log Message: Fix interactive mode (-i) when fall from script to prompt. Implement toxine's playlist file parser (all playlist stuff will be backported to xine-ui soon). Index: commands.c =================================================================== RCS file: /cvsroot/toxine/toxine/src/commands.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- commands.c 18 Jul 2002 22:19:30 -0000 1.20 +++ commands.c 19 Jul 2002 21:03:54 -0000 1.21 @@ -747,9 +747,11 @@ else { if(tox->command.execute) { + int old_interactive = tox->interactive; + tox->interactive = 0; toxine_handle_command(tox, NULL); - tox->interactive = 1; + tox->interactive = old_interactive; } grabbed_line = NULL; Index: common.h =================================================================== RCS file: /cvsroot/toxine/toxine/src/common.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- common.h 18 Jul 2002 22:19:30 -0000 1.6 +++ common.h 19 Jul 2002 21:03:54 -0000 1.7 @@ -47,11 +47,8 @@ #define EMPTY_PREFIX " " #define PROMPT "toxine{%s}> " -#define MAX_PLAYLIST 2048 /* Max playlist length */ #define PLAYLIST_NOLOOP 0 #define PLAYLIST_LOOP 1 -#define MAX_MEDIAMK 2048 - #define poutalign() { \ fprintf(stdout, "%s", EMPTY_PREFIX); \ Index: playlist.c =================================================================== RCS file: /cvsroot/toxine/toxine/src/playlist.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- playlist.c 18 Jul 2002 22:19:30 -0000 1.3 +++ playlist.c 19 Jul 2002 21:03:54 -0000 1.4 @@ -24,6 +24,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <assert.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> @@ -132,6 +133,13 @@ return((playlist->ln != NULL)); } +static void set_pos_to_value(char **p) { + assert(*p != NULL); + + while(*(*p) != '\0' && *(*p) != '=' && *(*p) != ':' && *(*p) != '{') ++(*p); + while(*(*p) == '=' || *(*p) == ':' || *(*p) == ' ' || *(*p) == '\t') ++(*p); +} + /* * Playlists guessing */ @@ -427,15 +435,177 @@ return NULL; } +static mediamark_t **guess_toxine_playlist(playlist_t *playlist, char *filename) { + mediamark_t **mmk = NULL; + + if(filename) { + if(playlist_check_for_file(filename)) { + int entries_pls = 0; + + if((playlist->fd = fopen(filename, "r")) != NULL) { + char buffer[32768]; + char *p, *pp; + int start = 0; + + memset(&buffer, 0, sizeof(buffer)); + p = buffer; + + while(playlist_get_next_line(playlist)) { + + if((playlist->ln) && (strlen(playlist->ln))) { + + if(strncmp(playlist->ln, "#", 1)) { + pp = playlist->ln; + + while(*pp != '\0') { + if(!strncasecmp(pp, "entry {", 7)) { + if(!start) { + start = 1; + pp += 7; + memset(&buffer, 0, sizeof(buffer)); + p = buffer; + } + else { + memset(&buffer, 0, sizeof(buffer)); + p = buffer; + goto __discard; + } + } + if((*pp == '}') && (*(pp + 1) == ';')) { + if(start) { + start = 0; + pp += 2; + + { /* OKAY, check found string */ + mediamark_t mmkf; + int mmkf_members[4]; + char *line; + char *m; + + mmkf.start = 0; + mmkf.end = -1; + mmkf_members[0] = 0; /* ident */ + mmkf_members[1] = -1; /* mrl */ + mmkf_members[2] = 0; /* start */ + mmkf_members[3] = 0; /* end */ + + xine_strdupa(line, (toxine_atoa(buffer))); + + while((m = xine_strsep(&line, ";")) != NULL) { + char *key; + + key = toxine_atoa(m); + if(strlen(key)) { + + if(!strncasecmp(key, "identifier", 10)) { + if(mmkf_members[0] == 0) { + mmkf_members[0] = 1; + set_pos_to_value(&key); + xine_strdupa(mmkf.ident, key); + } + } + else if(!strncasecmp(key, "start", 5)) { + if(mmkf_members[2] == 0) { + mmkf_members[2] = 1; + set_pos_to_value(&key); + mmkf.start = strtol(key, &key, 10); + } + } + else if(!strncasecmp(key, "end", 3)) { + if(mmkf_members[3] == 0) { + mmkf_members[3] = 1; + set_pos_to_value(&key); + mmkf.end = strtol(key, &key, 10); + } + } + else if(!strncasecmp(key, "mrl", 3)) { + if(mmkf_members[1] == -1) { + mmkf_members[1] = 1; + set_pos_to_value(&key); + xine_strdupa(mmkf.mrl, key); + } + } + } + } + + if((mmkf_members[1] == 0) || (mmkf_members[1] == -1)) { + /* printf("wow, no mrl found\n"); */ + goto __discard; + } + + if(mmkf_members[0] == 0) { + xine_strdupa(mmkf.ident, mmkf.mrl); + } + + /* + STORE new mmk; + */ +#if 0 + printf("DUMP mediamark entry:\n"); + printf("id: '%s'\n", mmkf.ident); + printf("mrl: '%s'\n", mmkf.mrl); + printf("start: %d\n", mmkf.start); + printf("end: %d\n", mmkf.end); +#endif + + entries_pls++; + + if(entries_pls == 1) + mmk = (mediamark_t **) xine_xmalloc(sizeof(mediamark_t *) * 2); + else + mmk = (mediamark_t **) realloc(mmk, sizeof(mediamark_t *) * (entries_pls + 1)); + _playlist_store_mmk(&mmk[(entries_pls - 1)], + mmkf.mrl, mmkf.ident, mmkf.start, mmkf.end); + + playlist->entries = entries_pls; + + } + + } + else { + memset(&buffer, 0, sizeof(buffer)); + p = buffer; + goto __discard; + } + } + + if(*pp != '\0') { + *p = *pp; + p++; + } + pp++; + } + + } + } + __discard: + } + + fclose(playlist->fd); + + if(entries_pls) { + mmk[entries_pls] = NULL; + playlist->type = strdup("TOX"); + return mmk; + } + } + } + } + return NULL; +} + /* * Public */ void playlist_add_entry(toxine_t *tox, char *mrl, char *ident, int start, int end) { if(!tox->playlist.num) tox->playlist.mmk = (mediamark_t **) xine_xmalloc(sizeof(mediamark_t *) * 2); - else - tox->playlist.mmk = (mediamark_t **) - realloc(tox->playlist.mmk, sizeof(mediamark_t *) * (tox->playlist.num + 1)); + else { + if(tox->playlist.num > 1) { + tox->playlist.mmk = (mediamark_t **) + realloc(tox->playlist.mmk, sizeof(mediamark_t *) * (tox->playlist.num + 1)); + } + } if(_playlist_store_mmk(&tox->playlist.mmk[tox->playlist.num], mrl, ident, start, end)) tox->playlist.num++; @@ -455,6 +625,7 @@ mediamark_t **mmk = NULL; mediamark_t **ommk; playlist_guess_func_t guess_functions[] = { + guess_toxine_playlist, guess_xmms_playlist_pls, guess_xmms_playlist_m3u, guess_xmms_playlist, @@ -471,7 +642,7 @@ } if(found) { - pinfo("Playlist file (%s) is valid.\n", filename); + pinfo("Playlist file (%s) is valid (%s).\n", filename, playlist->type); } else { perr("Playlist file (%s) isn't valid.\n", filename); @@ -521,19 +692,18 @@ if((fd = fopen(filename, "w")) != NULL) { -#warning implement loader - fprintf(fd, "; toxine playlist\n"); + fprintf(fd, "# toxine playlist\n"); for(i = 0; i < tox->playlist.num; i++) { fprintf(fd, "\nentry {\n"); - fprintf(fd, " identifier = %s\n", tox->playlist.mmk[i]->ident); - fprintf(fd, " mrl = %s\n", tox->playlist.mmk[i]->mrl); - fprintf(fd, " start = %d\n", tox->playlist.mmk[i]->start); - fprintf(fd, " end = %d\n", tox->playlist.mmk[i]->end); - fprintf(fd,"}\n"); + fprintf(fd, "\tidentifier = %s;\n", tox->playlist.mmk[i]->ident); + fprintf(fd, "\tmrl = %s;\n", tox->playlist.mmk[i]->mrl); + fprintf(fd, "\tstart = %d;\n", tox->playlist.mmk[i]->start); + fprintf(fd, "\tend = %d;\n", tox->playlist.mmk[i]->end); + fprintf(fd,"};\n"); } - fprintf(fd, "; END\n"); + fprintf(fd, "# END\n"); fclose(fd); pinfo("Playlist '%s' saved.\n", filename); Index: utils.c =================================================================== RCS file: /cvsroot/toxine/toxine/src/utils.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- utils.c 18 Jul 2002 22:19:30 -0000 1.5 +++ utils.c 19 Jul 2002 21:03:54 -0000 1.6 @@ -203,14 +203,15 @@ void toxine_set_current_mrl(toxine_t *tox, const char *mrl) { if(tox && mrl) { + if((tox->playlist.cur = toxine_lookup_in_playlist(tox, mrl)) == -1) { char *expanded_mrl; expanded_mrl = tilde_expand(mrl); playlist_add_entry(tox, expanded_mrl, NULL, 0, -1); - tox->playlist.cur = tox->playlist.num; - + tox->playlist.cur = (tox->playlist.num - 1); + free(expanded_mrl); } |