+ PcdValueList = SplitPcdValueString(PcdValue.strip()[1:-1])\r
+ LabelDict = {}\r
+ NewPcdValueList = []\r
+ ReLabel = re.compile('LABEL\((\w+)\)')\r
+ ReOffset = re.compile('OFFSET_OF\((\w+)\)')\r
+ LabelOffset = 0\r
+ for Index, Item in enumerate(PcdValueList):\r
+ # compute byte offset of every LABEL\r
+ LabelList = ReLabel.findall(Item)\r
+ Item = ReLabel.sub('', Item)\r
+ Item = Item.strip()\r
+ if LabelList:\r
+ for Label in LabelList:\r
+ if not IsValidCName(Label):\r
+ raise BadExpression('%s is not a valid c variable name' % Label)\r
+ if Label not in LabelDict.keys():\r
+ LabelDict[Label] = str(LabelOffset)\r
+ if Item.startswith('UINT8'):\r
+ LabelOffset = LabelOffset + 1\r
+ elif Item.startswith('UINT16'):\r
+ LabelOffset = LabelOffset + 2\r
+ elif Item.startswith('UINT32'):\r
+ LabelOffset = LabelOffset + 4\r
+ elif Item.startswith('UINT64'):\r
+ LabelOffset = LabelOffset + 8\r
+ else:\r
+ try:\r
+ ItemValue, ItemSize = ParseFieldValue(Item)\r
+ LabelOffset = LabelOffset + ItemSize\r
+ except:\r
+ LabelOffset = LabelOffset + 1\r
+\r
+ for Index, Item in enumerate(PcdValueList):\r
+ # for LABEL parse\r
+ Item = Item.strip()\r