Problem with ^A in Filename

Message ID 44423DF1.5080209@cadsoft.de
State New
Headers

Commit Message

Klaus Schmidinger April 16, 2006, 12:52 p.m. UTC
  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
  

Patch

--- recording.c	2006/04/09 13:49:51	1.144
+++ recording.c	2006/04/16 12:43:58
@@ -389,7 +389,10 @@ 
 struct tCharExchange { char a; char b; };
 tCharExchange CharExchange[] = {
   { '~',  '/'    },
+  { '/',  '~'    },
   { ' ',  '_'    },
+  // backwards compatibility:
+  { '\'', '\''   },
   { '\'', '\x01' },
   { '/',  '\x02' },
   { 0, 0 }
--- menu.c	2006/04/16 10:09:21	1.433
+++ menu.c	2006/04/16 12:20:46
@@ -2036,7 +2036,7 @@ 
      cRecording *recording = GetRecording(ri);
      if (recording) {
         char *parameter = NULL;
-        asprintf(&parameter, "'%s'", recording->FileName());
+        asprintf(&parameter, "\"%s\"", *strescape(recording->FileName(), "\"$"));
         cMenuCommands *menu;
         eOSState state = AddSubMenu(menu = new cMenuCommands(tr("Recording commands"), &RecordingCommands, parameter));
         free(parameter);