Problem with ^A in Filename
Commit Message
Klaus Schmidinger wrote:
> Udo Richter wrote:
>
>> Klaus Schmidinger wrote:
>>
>>> Patrick Fischer wrote:
>>>
>>>> @Ripley's unglaubliche Welt
>>>> will be saved as (only shown if I pipe "ll . > out.txt" and look at
>>>> the file or by using xterm)
>>>> @Ripley^As_unglaubliche_Welt
>>>
>>>
>>>
>>> The single quote character is mapped to 0x01 so that in shell script
>>> it is guaranteed that no recording name contains such a character, and
>>> you can always be sure that enclosing a recording name in single quotes
>>> will work.
>>
>>
>>
>> This is only true in classic mode. In VFAT-mode, unsafe characters
>> like this are mapped to literal ascii codes, in this case '#27'.
>>
>> Using ASCII control chars (0x01 alias SOH for ', 0x02 alias STX for /)
>> in file names doesn't sound like a good idea to me anyway. Wouldn't it
>> be better to use '#27' and '#2F' (and consequently '#23' for #) in
>> non-VFAT mode too?
>>
>> Cheers,
>>
>> Udo
>
>
> I've now made it so that in "normal" mode (non-VFAT) the single quote
> is not mapped any more (IIRC I thought that this might be necessary
> for external commands, but with strescape() and "..." this works just
> fine). The '/' and '~' are swapped between internal and external
> representation, so that no more "control" characters are used.
>
> For backwards compatibility 0x01, 0x02 and 0x03 are still recognized.
>
> Please give the attached patch a try.
>
> Klaus
Well, my previous patch was actually much longer than necessary.
That's because originally I had followed that path of actually
en-/decoding these characters, but then I realized that this might
cause trouble with existing recording names that already contain
an unescaped '#'. Now I realized that a much smaller patch should
do the trick just as well, so here's a second try.
Klaus
@@ -389,7 +389,10 @@
struct tCharExchange { char a; char b; };
tCharExchange CharExchange[] = {
{ '~', '/' },
+ { '/', '~' },
{ ' ', '_' },
+ // backwards compatibility:
+ { '\'', '\'' },
{ '\'', '\x01' },
{ '/', '\x02' },
{ 0, 0 }
@@ -2036,7 +2036,7 @@
cRecording *recording = GetRecording(ri);
if (recording) {
char *parameter = NULL;
- asprintf(¶meter, "'%s'", recording->FileName());
+ asprintf(¶meter, "\"%s\"", *strescape(recording->FileName(), "\"$"));
cMenuCommands *menu;
eOSState state = AddSubMenu(menu = new cMenuCommands(tr("Recording commands"), &RecordingCommands, parameter));
free(parameter);