Escapes are translated first, and only once (see mp3info source).
This commit is contained in:
116
tools/cueprint.c
116
tools/cueprint.c
@@ -273,45 +273,6 @@ void print_conv (char *start, int length, Cd *cd, int trackno)
|
|||||||
free(conv);
|
free(conv);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* print an single-character escape
|
|
||||||
* `c' is the character after the `/'
|
|
||||||
* NOTE: this does not handle octal and hexidecimal escapes
|
|
||||||
* except for \0
|
|
||||||
*/
|
|
||||||
void print_esc (char *c)
|
|
||||||
{
|
|
||||||
switch (*c) {
|
|
||||||
case 'a':
|
|
||||||
putchar('\a');
|
|
||||||
break;
|
|
||||||
case 'b':
|
|
||||||
putchar('\b');
|
|
||||||
break;
|
|
||||||
case 'f':
|
|
||||||
putchar('\f');
|
|
||||||
break;
|
|
||||||
case 'n':
|
|
||||||
putchar('\n');
|
|
||||||
break;
|
|
||||||
case 'r':
|
|
||||||
putchar('\r');
|
|
||||||
break;
|
|
||||||
case 't':
|
|
||||||
putchar('\t');
|
|
||||||
break;
|
|
||||||
case 'v':
|
|
||||||
putchar('\v');
|
|
||||||
break;
|
|
||||||
case '0':
|
|
||||||
putchar('\0');
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* ?, ', " are handled by the default */
|
|
||||||
putchar(*c);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void cd_printf (char *format, Cd *cd, int trackno)
|
void cd_printf (char *format, Cd *cd, int trackno)
|
||||||
{
|
{
|
||||||
char *c; /* pointer into format */
|
char *c; /* pointer into format */
|
||||||
@@ -319,8 +280,7 @@ void cd_printf (char *format, Cd *cd, int trackno)
|
|||||||
int conv_length;
|
int conv_length;
|
||||||
|
|
||||||
for (c = format; '\0' != *c; c++) {
|
for (c = format; '\0' != *c; c++) {
|
||||||
switch (*c) {
|
if ('%' == *c) {
|
||||||
case '%':
|
|
||||||
conv_start = c;
|
conv_start = c;
|
||||||
conv_length = 1;
|
conv_length = 1;
|
||||||
c++;
|
c++;
|
||||||
@@ -363,15 +323,8 @@ void cd_printf (char *format, Cd *cd, int trackno)
|
|||||||
conv_length++;
|
conv_length++;
|
||||||
|
|
||||||
print_conv(conv_start, conv_length, cd, trackno);
|
print_conv(conv_start, conv_length, cd, trackno);
|
||||||
break;
|
} else {
|
||||||
case '\\':
|
|
||||||
c++;
|
|
||||||
|
|
||||||
print_esc(c);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
putchar(*c);
|
putchar(*c);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -406,6 +359,64 @@ int info (char *name, int format, int trackno, char *d_template, char *t_templat
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* translate escape sequences in a string
|
||||||
|
* string is overwritten and terminated
|
||||||
|
* TODO: this does not handle octal and hexidecimal escapes
|
||||||
|
* except for \0
|
||||||
|
*/
|
||||||
|
void translate_escapes(char *s)
|
||||||
|
{
|
||||||
|
char *read;
|
||||||
|
char *write;
|
||||||
|
|
||||||
|
read = s;
|
||||||
|
write = s;
|
||||||
|
|
||||||
|
while ('\0' != *read) {
|
||||||
|
if ('\\' == *read) {
|
||||||
|
read++;
|
||||||
|
|
||||||
|
switch (*read) {
|
||||||
|
case 'a':
|
||||||
|
*write = '\a';
|
||||||
|
break;
|
||||||
|
case 'b':
|
||||||
|
*write = '\b';
|
||||||
|
break;
|
||||||
|
case 'f':
|
||||||
|
*write = '\f';
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
*write = '\n';
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
*write = '\r';
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
*write = '\t';
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
*write = '\v';
|
||||||
|
break;
|
||||||
|
case '0':
|
||||||
|
*write = '\0';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* ?, ', " are handled by the default */
|
||||||
|
*write = *read;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
*write = *read;
|
||||||
|
}
|
||||||
|
|
||||||
|
read++;
|
||||||
|
write++;
|
||||||
|
}
|
||||||
|
|
||||||
|
*write = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
int main (int argc, char **argv)
|
int main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
int format = UNKNOWN;
|
int format = UNKNOWN;
|
||||||
@@ -447,8 +458,8 @@ int main (int argc, char **argv)
|
|||||||
|
|
||||||
/* if no disc or track template is set, use the defaults for both */
|
/* if no disc or track template is set, use the defaults for both */
|
||||||
if (NULL == d_template && NULL == t_template) {
|
if (NULL == d_template && NULL == t_template) {
|
||||||
d_template = D_TEMPLATE;
|
d_template = strdup(D_TEMPLATE);
|
||||||
t_template = T_TEMPLATE;
|
t_template = strdup(T_TEMPLATE);
|
||||||
} else {
|
} else {
|
||||||
if (NULL == d_template)
|
if (NULL == d_template)
|
||||||
d_template = "";
|
d_template = "";
|
||||||
@@ -457,6 +468,9 @@ int main (int argc, char **argv)
|
|||||||
t_template = "";
|
t_template = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
translate_escapes(d_template);
|
||||||
|
translate_escapes(t_template);
|
||||||
|
|
||||||
if (optind == argc) {
|
if (optind == argc) {
|
||||||
info("-", format, trackno, d_template, t_template);
|
info("-", format, trackno, d_template, t_template);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user