Changeset 1458

Show
Ignore:
Timestamp:
11/22/08 12:47:52 (12 years ago)
Author:
arnonym
Message:

Drop the hack and add a real(?) parser. The configtest.cfg is taken from http://subversion.ffado.org/index.fcgi/wiki/ConfigFile and is parsed correctly. The good thing is that the parser can be used to extract the other parts of the config too.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/libffado-2.0/support/mixer-qt4/ffado_configuration.py

    r1427 r1458  
    2424import re, os 
    2525 
     26import shlex 
     27 
    2628class DeviceList: 
    2729        def __init__( self, filename="" ): 
     
    3436                        return 
    3537                f = open( filename, "r" ) 
    36                 stream = f.read() 
    37                 stream = re.sub( "#[^#\n]*\n", "\n", stream )                               # remove the comments 
    38                 stream = re.sub( "\s", "", stream )                                         # remove all white-spaces and line-breaks 
    39                 stream = stream.replace( "device_definitions=({", "" ).replace( "});", "" ) # remove the trail and end 
    40                 stream = stream.replace( "\"", "" )                                         # remove the "'s around 
    4138 
    42                 dev_strings = stream.split( "},{" ) 
    43                 for s in dev_strings: 
    44                         item = dict() 
    45                         pairs = s.split(";") 
    46                         for p in pairs: 
    47                                 if not p == "": 
    48                                         key = p[0:p.find("=")] 
    49                                         value = p[p.find("=")+1:] 
    50                                         if re.search( "^0x[0-9a-fA-F]*", value ) != None: # convert hex-numbers to int 
    51                                                 value = int( value, 16 )              # or should it be long? 
    52                                         item[ key ] = value 
    53                         self.addDevice( item ) 
     39                lex = Parser( f ) 
     40                config = {} 
     41                while lex.peaktoken() != lex.eof: 
     42                        tmp = lex.parsenamedvalue() 
     43                        if tmp != None: 
     44                                config[ tmp[0] ] = tmp[1] 
     45                for dev in config["device_definitions"]: 
     46                        self.addDevice( dev ) 
    5447 
    5548        def getDeviceById( self, vendor, model ): 
     
    6760                dev.update( device_dict ) 
    6861 
     62class Parser: 
     63        def __init__( self, file ): 
     64                self.lex = shlex.shlex( file ) 
     65                self.eof = self.lex.eof 
     66 
     67        def peaktoken( self ): 
     68                token = self.lex.get_token() 
     69                self.lex.push_token( token ) 
     70                return token 
     71 
     72        def parselist( self, level="" ): 
     73                token = self.peaktoken() 
     74                if token != "(": 
     75                        return 
     76                self.lex.get_token() 
     77                #print "%sWill parse list" % level 
     78                ret = [] 
     79                token = self.peaktoken() 
     80                while token != ")": 
     81                        ret.append( self.parsenamedvalue( level+"  " ) ) 
     82                        token = self.peaktoken() 
     83                #print "%slist is %s" % (level, str(ret)) 
     84                self.lex.get_token() 
     85                if self.peaktoken() == ",": 
     86                        #print "%sFound a delimiter" % level 
     87                        self.lex.get_token() 
     88                return ret 
     89 
     90        def parsemap( self, level="" ): 
     91                token = self.lex.get_token() 
     92                if token != "{": 
     93                        return 
     94                #print "%sWill parse map" % level 
     95                ret = {} 
     96                token = self.peaktoken() 
     97                while token != "}": 
     98                        #self.push_token( token ) 
     99                        tmp = self.parsenamedvalue( level+"  " ) 
     100                        if tmp != None: 
     101                                ret[ tmp[0] ] = tmp[1] 
     102                        token = self.peaktoken() 
     103                token = self.lex.get_token() 
     104                #print "%sMap ended with '%s' and '%s'"% (level,token,peaktoken(self)) 
     105                if self.peaktoken() in (",",";"): 
     106                        #print "%sFound a delimiter!" % level 
     107                        self.lex.get_token() 
     108                return ret 
     109 
     110        def parsevalue( self, level="" ): 
     111                token = self.lex.get_token() 
     112                #print "%sparsevalue() called on token '%s'" % (level, token) 
     113                self.lex.push_token( token ) 
     114                if token == "(": 
     115                        value = self.parselist( level+"  " ) 
     116                elif token == "{": 
     117                        value = self.parsemap( level+"  " ) 
     118                else: 
     119                        value = self.lex.get_token().replace( "\"", "" ) 
     120                token = self.peaktoken() 
     121                if token == ";": 
     122                        #print "%sFound a delimiter!" % level 
     123                        self.lex.get_token() 
     124                return value 
     125 
     126        def parsenamedvalue( self, level="" ): 
     127                token = self.lex.get_token() 
     128                #print "%sparsenamedvalue() called on token '%s'" % (level, token) 
     129                if token == "{": 
     130                        self.lex.push_token( token ) 
     131                        return self.parsemap( level+"  " ) 
     132                if len(token) > 0 and token not in ("{","}","(",")",",",";"): 
     133                        #print "%sGot name '%s'" %(level,token) 
     134                        name = token 
     135                        token = self.lex.get_token() 
     136                        if token in ("=",":"): 
     137                                #print "%sWill parse value" % level 
     138                                value = self.parsevalue( level ) 
     139                                return (name,value) 
     140                #print "%sparsenamedvalue() will return None!" % level 
     141                return 
    69142 
    70143#