Solved

Parsing Escape Characters

Posted on 2004-09-17
5
881 Views
Last Modified: 2013-12-03
Greetings,
Lately I've taken interest in how to process escape characters internally for my own usage. For example, let's say I want "^" to be a special character that my script needs to escape. I would add the traditional escape character to it, so it becomes "\^". However, if that sequence was input, it would need to become "\\^". You get the idea.

Then beyond that, I need to understand the methodology to processing those escape sequences properly and recursively. Can somebody help me out with pseudo-code algorithms for doing this???

500 points for a complete, understandable walkthrough =)

Thanks
0
Comment
Question by:duerra
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
  • 2
5 Comments
 
LVL 5

Expert Comment

by:tzxie2000
ID: 12083805
I'd like to say about C  escape characters '\'

if a string like :asdf\\\'\" the real mean is asdf\'" and \is the escape char,we can write

void Decode(char *src,char * des)
{
   char * p;
   p=src;
   q=des;
   while (*p!=0)
   {
       if(*p!='\\')
       {
           //copy char to des and move the point
           continue;
        }
       //get next char and copy to the des and move  the point
   }
}

a runable version about this should be warranted by the administrator about this is not a homework
other questions can be talk about
0
 
LVL 2

Accepted Solution

by:
MrRooster earned 500 total points
ID: 12085219
I generally do something like (in vaguely C pseudocode):-

char c;

while (!eof()) {
       c = getNextChar();
       if (c=='\') {
              // It is an escape char, deal with it
              if (eof())
                  return endOfFileError;

              c = getNextChar();
              switch(c) {
                  case '\' :
                      handleNormalChar(c);
                      break;
                  case 'r' :
                       // code to deal with /r (an example)
                       break;
                   default :
                       // generic invalid char, or default char handler code
              }
       } else
            handleNormalChar(c);
}
0
 
LVL 4

Author Comment

by:duerra
ID: 12093471
MrRooster, thanks for that little bit.  I will try it out and see if it works, and award as appropriate :).  It seems so simple, too - too bad I didn't figure that out myself.

tzxie2000, unfortunately, I was not able to understand what you are saying.  I can say that this isn't homework, by any means.  I have been wanting to develop some code at the office which required me to escape characters in JavaScript characters, but I was finding it rather cumbersome.  
0
 
LVL 2

Expert Comment

by:MrRooster
ID: 12131330
If you're playing with javascript it does provide 'escape' and 'unescape' functions. (well, it does in a browser anyway, not 100% sure if they're part of the core spec but they might well be.), which are generally used for making strings URL and HTML safe, but it might be useful, try:-

alert( escape('hello world') )

and

alert( unescape('hello%20world'))
0
 
LVL 4

Author Comment

by:duerra
ID: 12135293
Nah nah, this was/is something completely different.  Since the issue (which was a few weeks ago), I took the JS in a different direction, but I was still very curious as to how languages process escape sequences.  

Your code was valid.  Oddly enough, though, I worked on some code after I saw your post that does what I was looking to do, but it doesn't really resemble your code in any way.  I guess it just shows that there's more than one way to slaughter the beast.  The code I designed looks like this (PHP syntax):

$string = '~blah blah \~ blah \\\~blah blah';
$newStr = replace_unescaped('~', '.', $string);
echo "String: $string \n";
echo "New String: $newStr \n";

//Function assumes that the replacement string
//is used as an escape character/string
function replace_unescaped($strFind, $strReplacement, $strSubject)
{
      $offset = 0;
      while(($loc = strpos($strSubject, $strFind, $offset)) !== false)
      {
            $numSlashes = 0;
            
            $start = $loc-1; //Start one char before the location of $strFind
            //Double backslash below required here to not escape the last single quote
            while(($start-$numSlashes) >= 0 && substr($strSubject, $start-$numSlashes, 1) == '\\')
            {
                  $numSlashes++;
            }
            
            //If it's an even number of backslashes, then the backslash is
            //not escaped, and is our string -- replace
            if($numSlashes%2==0)
            {
                  $beg = substr($strSubject, 0, $loc);
                  $mid = $strReplacement;
                  $end = substr($strSubject, $loc+strlen($strFind));
                  $strSubject = $beg.$mid.$end;
                  $offset = $loc+strlen($strReplacement);
            }
            else
            {//The escape character has been escaped - ignore
                  $offset = $loc+strlen($strFind);      
            }
      }
      return $strSubject;
}

This outputs:
String: ~blah blah \~ blah \\~blah blah
New String: .blah blah \~ blah \\.blah blah
0

Featured Post

[Webinar] How Hackers Steal Your Credentials

Do You Know How Hackers Steal Your Credentials? Join us and Skyport Systems to learn how hackers steal your credentials and why Active Directory must be secure to stop them. Thursday, July 13, 2017 10:00 A.M. PDT

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article will show, step by step, how to integrate R code into a R Sweave document
If you’re thinking to yourself “That description sounds a lot like two people doing the work that one could accomplish,” you’re not alone.
With the power of JIRA, there's an unlimited number of ways you can customize it, use it and benefit from it. With that in mind, there's bound to be things that I wasn't able to cover in this course. With this summary we'll look at some places to go…
Progress

688 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question