Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
?
Solved

windows to linux path delimeters and case substitution in cpp code

Posted on 2010-11-11
9
Medium Priority
?
425 Views
Last Modified: 2012-05-10
Hi,

I have received a significant amount of cpp that was developed on windows and now needs to be compiled on Linux. My main focus for the time being is to modify paths and case in file names within paths.

The paths are easy with the sharp end of the stick doing the following sed within a series of loops in my bash script:

sed -i 's#\\#/#' <path/filename>

Could anyone ease my frustration with substituting uppercase but only in string matches where windows path delimiters can be found? Fortunately I have been unable  to find whitespace in paths...yet.

eg
SYSTEMINCLUDE \root\subdir_A\Component\Include\stdapis
subs to:
SYSTEMINCLUDE /root/subdir_a/component/include/stdapis

Cheers,
ddd
0
Comment
Question by:dingdangdo
  • 5
  • 2
8 Comments
 
LVL 3

Expert Comment

by:Vryali
ID: 34120527
Something simple like this would work fine, I imagine?

grep "SYSTEMINCLUDE" file.c | tr '[:upper:]' '[:lower:]'

Just run your inital sed script to convert slashes and run that after.  I imagine you have an if statement already that checks if the given header file is in windows format vs *nux format, so you could alternatively just tack on the tr command after the sed statement:

sed -i 's#\\#/#' <path/filename> | tr '[:upper:]' '[:lower:]'

Unsure if that's entirely what you're looking for, but given what you said that's my initial take.
0
 

Accepted Solution

by:
dingdangdo earned 0 total points
ID: 34140144
Hi Vryali,

Many thanks for the contrib. It's just the path strings I wanted to do the substitution in. I ended up with it in python. The key line is:
repattern-re.compile(r"^(?P<head>.*?)(?P<path>[^/]/[^/][/|a-z|A-Z|_|\-|0-9|\.]+)(?P<tail>.*)$");

It could have ben done in shell using sed. 'Just the way it went on the day :-)

Cheers,
ddd

#! /usr/bin/python

import os
import re
import sys
import datetime
import time
import shutil
import inspect
import glob
import traceback
import copy

verboseOutput = False
doOutFileCopy = True

modified = False
shownFilename = False

# --------------------------------------------------------------

def recurseReplace( line ):
    global shownFilename
    reRes = repattern.match(line.replace('\\', '/'));      
    if( reRes ):

        if verboseOutput:
            print " *** regex match *** "

        line = reRes.group('head') + reRes.group('path').lower() + recurseReplace( reRes.group('tail') )

    return line

# --------------------------------------------------------------

fileName = None
if (len(sys.argv) < 2):
    sys.exit(-1)
else:
    fileName = sys.argv[1]
    fileOut = fileName + '.out'

repattern = re.compile(r"^(?P<head>.*?)(?P<path>[^/]/[^/][/|a-z|A-Z|_|\-|0-9|\.]+)(?P<tail>.*)$");
# print "=== Opening file: " + fileName
fIn = open( fileName )
fOut= open( fileOut, "w" )

for line in fIn:
    lineEnd = "\n\r"
    if( line.find("\n\r") >= 0 ):
        lineEnd = "\n\r"
    elif( line.find("\r\n") >= 0 ):
        lineEnd = "\r\n"
    elif( line.find("\r") >= 0 ):
        lineEnd = "\r"
    elif( line.find("\n") >= 0 ):
        lineEnd = "\n"

    line = line.replace("\n", "").replace("\r", "")
    if verboseOutput:
        print line

    newLine = recurseReplace( line )
   
    fOut.write( newLine + lineEnd )
   
    if newLine != line:
        if shownFilename == False:
            print "=== Opening file: " + fileName
            shownFilename = True
        print ' Changed "' + line + '" to "' + newLine + '"'
        modified = True

fIn.close()
fOut.close()

if( modified == False ):
    os.remove( fileOut )
elif doOutFileCopy:
    try:
        os.remove( fileOut + ".orig"  )
    except:
        fukit = True
    os.rename( fileName, fileName + ".orig" )
    os.rename( fileOut, fileName )
0
 
LVL 3

Expert Comment

by:Vryali
ID: 34140280
He found the solution himself and worked it out as a Rube Goldberg-esque solution, and it apparently works (Didn't go through his code).  His closing comment bit though is:

"Hope I don't get these points. I've only asked 2 questions. Wasn't expecting to find the solution ot this one myself."

I'm objecting because it looks like he's stating that I should have gotten the points (since he hopes he doesn't get them and I'm the other response/simpler response.

I'm not really sure, he got the right answer in another fashion, but it looks like he wanted me to get the points?  I don't mind not getting the points... Just sayin'.  Happily would withdraw my objection (If you can even do that?) if he was intending to give out zero points since he found the correct answer on his own...?
0
Granular recovery for Microsoft Exchange

With Veeam Explorer for Microsoft Exchange you can choose the Exchange Servers and restore points you’re interested in, and Veeam Explorer will present the contents of those mailbox stores for browsing, searching and exporting.

 
LVL 3

Expert Comment

by:Vryali
ID: 34140296
Ah, I didn't realize it would post that publicly, I feel like an ass now; Damn you Experts-Exchange  for not giving me an edit or delete button that I can find...
0
 

Author Comment

by:dingdangdo
ID: 34140482
Hi Vryali,

I am sorry you didn't receive points but your solution wasn't what I was after. I must only substitute case in the <path>/<filename> portions of each line as stated in the example I submitted:

eg
SYSTEMINCLUDE \root\subdir_A\Component\Include\stdapis
subs to:
SYSTEMINCLUDE /root/subdir_a/component/include/stdapis

Your solution would have yielded:
systeminclude /root/subdir_a/component/include/stdapis

Many thanks though for taking the time on it. BTW as I hoped I didn't get the points. It wouldn't be right to be rewarded for answering my own question.

Cheers,
ddd

0
 
LVL 3

Expert Comment

by:Vryali
ID: 34140873
Ah cheers,i was just confused by the wording, my apologies
0
 
LVL 3

Expert Comment

by:Vryali
ID: 34140884
Ah cheers,i was just confused by the wording, my apologies
0
 

Expert Comment

by:_alias99
ID: 34179136
All,
 
Following an 'Objection' by Vryali (at http://www.experts-exchange.com/Q_26616568.html) to the intended closure of this question, it has been reviewed by at least one Moderator and is being closed as originally requested by the author.
 
Thank you,
 
_alias99
Community Support Moderator
0

Featured Post

Prepare for your VMware VCP6-DCV exam.

Josh Coen and Jason Langer have prepared the latest edition of VCP study guide. Both authors have been working in the IT field for more than a decade, and both hold VMware certifications. This 163-page guide covers all 10 of the exam blueprint sections.

Question has a verified solution.

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

Utilizing an array to gracefully append to a list of EmailAddresses
Active Directory replication delay is the cause to many problems.  Here is a super easy script to force Active Directory replication to all sites with by using an elevated PowerShell command prompt, and a tool to verify your changes.
Learn several ways to interact with files and get file information from the bash shell. ls lists the contents of a directory: Using the -a flag displays hidden files: Using the -l flag formats the output in a long list: The file command gives us mor…
How to Install VMware Tools in Red Hat Enterprise Linux 6.4 (RHEL 6.4) Step-by-Step Tutorial
Suggested Courses

578 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