
# -*- coding: iso-8859-1 -*-

import os
import sys
import string
import popen2
import stat
import re
from os import path

class CMT:

    def removedirs (self, top):
        # Delete everything reachable from the directory named in 'top'.
        # CAUTION:  This is dangerous!  For example, if top == '/', it
        # could delete all your disk files.
        if os.path.exists (top):
            for root, dirs, files in os.walk (top, topdown=False):
                for name in files:
                    name = root + '/' + name
                    os.chmod (name, stat.S_IWRITE)
                    os.remove (name)
                for name in dirs:
                    name = root + '/' + name
                    os.chmod (name, stat.S_IWRITE)
                    os.rmdir (name)
            os.chmod (top, stat.S_IWRITE)
            os.rmdir (top)


    #----------------------------------------------------
    #
    # Exécution d'une commande du shell
    #
    def execute (self, cmd):
        #print '> ' + cmd
        r, w, e = popen2.popen3(cmd)
        lines = []
        for line in r.readlines():
            line = string.rstrip (line)
            lines.append (line)
        #for line in e.readlines():
        #    line = string.rstrip (line)
        #    lines.append (line)
        r.close()
        w.close()
        e.close()
        return lines
        #end execute

    #----------------------------------------------------
    def show_lines (lines):
        for line in lines:
            print line
        # end show_lines

    #----------------------------------------------------
    cmtexe = os.environ ['CMTROOT'] + '/' + os.environ ['CMTBIN'] + '/cmt.exe'
    macros = dict ()
    sets = dict ()
    uses = []
    pwd = ''
    
    def __init__ (self):

        self.pwd = self.do (self.cmtexe + ' show pwd')
        if self.pwd == '':
            self.pwd = os.getcwd ()
        
        temp_file_name1 = os.path.join (self.pwd, 'CMT' + str(os.getpid ()) + '1.txt')
        temp_file_name2 = os.path.join (self.pwd, 'CMT' + str(os.getpid ()) + '2.txt')
        temp_file = file (temp_file_name1, 'w+')

        lines = self.execute (self.cmtexe + ' -quiet build tag_makefile')
        for line in lines:
            temp_file.write (line + '\n')
        temp_file.close ()
        
        self.do ('filter ' + temp_file_name1 + ' ' + temp_file_name2)
        
        temp_file = file (temp_file_name2)
        
        for line in temp_file.readlines ():
            name = re.sub ('=.*', '', line)
            value = re.sub ('^' + name + '=', '', line)
            self.macros [name] = value

        temp_file.close ()

        os.remove (temp_file_name1)
        os.remove (temp_file_name2)

        #lines = execute (self.cmtexe + ' show sets')
        #for line in lines:
        #    name = re.sub ('=.*', '', line)
        #    value = re.sub ('^' + name + '=', '', line)
        #    sets [name] = value

        lines = self.execute (self.cmtexe + ' show uses')
        for line in lines:
            if line[0] == '#':
                continue
            self.uses.append (line)

    def macro_value (self, name):
        if not self.macros.has_key (name):
            lines = self.execute (self.cmtexe + ' show macro_value ' + name)
            self.macros[name] = ''
            for line in lines:
                self.macros[name] = line
                break
        return self.macros[name]

    def do (self, cmd):
        lines = self.execute (self.cmtexe + ' -quiet ' + cmd)
        if len(lines) > 0:
            return lines[0]
        else:
            return ''

