Fixed the typedef's name display in Local and Watch variables window
[clinton/Virtual-Jaguar-Rx.git] / src / debugger / DWARFManager.cpp
index a078191..3817763 100644 (file)
-//
-// DWARFManager.cpp: DWARF format manager
-//
-// by Jean-Paul Mari
-//
-// JPM = Jean-Paul Mari <djipi.mari@gmail.com>
-//
-// WHO  WHEN        WHAT
-// ---  ----------  ------------------------------------------------------------
-// JPM  12/03/2016  Created this file
-// JPM  12/03/2016  DWARF format support
-
-
-#include       <stdlib.h>
-#include       <stdio.h>
-#include       <stdint.h>
-#include       <string.h>
-#include       <libdwarf.h>
-#include       <dwarf.h>
-
-
-// Source line internal structure
-struct DMIStruct_LineSrc
-{
-       size_t Tag;
-       size_t StartPC;
-       size_t NumLineSrc;
-       char *PtrLineSrc;
-}S_DMIStruct_LineSrc;
-
-// Base type internal structure
-struct BaseTypeStruct
-{
-       size_t Tag;                                                             // Type's Tag
-       size_t Offset;                                                  // Type's offset
-       size_t TypeOffset;                                              // Type's offset on another type
-       size_t ByteSize;                                                // Type's Byte Size
-       size_t Encoding;                                                // Type's encoding
-       char *PtrName;                                                  // Type's name
-}S_BaseTypeStruct;
-
-// Variables internal structure
-struct VariablesStruct
-{
-       size_t Addr;                                                    // Variable memory address
-       char *PtrName;                                                  // Variable's name
-       size_t TypeOffset;                                              // Offset pointing on the Variable's Type
-       size_t TypeByteSize;                                    // Variable's Type byte size
-       size_t TypeTag;                                                 // Variable's Type Tag
-       size_t TypeEncoding;                                    // Variable's Type encoding
-       char *PtrTypeName;                                              // Variable's Type name
-}S_VariablesStruct;
-
-// Sub program internal structure
-struct SubProgStruct
-{
-       size_t Tag;
-       size_t NumLineSrc;
-       size_t StartPC;
-       size_t LowPC, HighPC;
-       char *PtrLineSrc;
-       char *PtrSubprogramName;
-       size_t NbLinesSrc;
-       DMIStruct_LineSrc *PtrLinesSrc;
-}S_SubProgStruct;
-
-// Compilation Unit internal structure
-struct CUStruct
-{
-       size_t Tag;
-       size_t LowPC, HighPC;
-       char *PtrProducer;                                                              // Pointer to the "Producer" information (compiler and compilation options used)
-       char *PtrFullFilename;                                                  // Pointer to full namefile (directory & filename)
-       size_t SizeLoadSrc;                                                             // Source code size
-       char *PtrLoadSrc;                                                               // Pointer to loaded source code
-       size_t NbLinesLoadSrc;                                                  // Lines source number
-       char **PtrLinesLoadSrc;                                                 // Pointer lists to each source line put in QT html/text conformity
-       size_t NbSubProgs;                                                              // Number of sub programs / routines
-       SubProgStruct *PtrSubProgs;                                             // Pointer to the sub programs / routines information structure
-       size_t NbTypes;
-       BaseTypeStruct *PtrTypes;
-       size_t NbVariables;                                                             // Variables number
-       VariablesStruct *PtrVariables;                                  // Pointer to the variables list information structure
-}S_CUStruct;
-
-
-// Dwarf management
-uint32_t LibDwarf;
-uint32_t NbCU;
-Dwarf_Ptr errarg;
-Dwarf_Error error;
-Dwarf_Debug dbg;
-CUStruct *PtrCU;
-
-
-//
-Dwarf_Handler DWARFManager_ErrorHandler(Dwarf_Ptr perrarg);
-void DWARFManager_InitDMI(void);
-void DWARFManager_CloseDMI(void);
-bool DWARFManager_ElfClose(void);
-char *DWARFManager_GetLineSrcFromNumLine(char *PtrSrcFile, size_t NumLine);
-
-
-//
-Dwarf_Handler DWARFManager_ErrorHandler(Dwarf_Ptr perrarg)
-{
-       return  0;
-}
-
-
-// Dwarf manager init
-void DWARFManager_Init(void)
-{
-       LibDwarf = DW_DLV_NO_ENTRY;
-}
-
-
-// Dwarf manager Reset
-bool DWARFManager_Reset(void)
-{
-       return DWARFManager_ElfClose();
-}
-
-
-// Dwarf manager Close
-bool DWARFManager_Close(void)
-{
-       return(DWARFManager_Reset());
-}
-
-
-// Dwarf manager Elf init
-int    DWARFManager_ElfInit(Elf *ElfPtr)
-{
-       if ((LibDwarf = dwarf_elf_init(ElfPtr, DW_DLC_READ, (Dwarf_Handler)DWARFManager_ErrorHandler, errarg, &dbg, &error)) == DW_DLV_OK)
-       {
-               DWARFManager_InitDMI();
-       }
-
-       return LibDwarf;
-}
-
-
-// Dwarf manager Elf close
-bool DWARFManager_ElfClose(void)
-{
-       if (LibDwarf == DW_DLV_OK)
-       {
-               DWARFManager_CloseDMI();
-
-               if (dwarf_finish(dbg, &error) == DW_DLV_OK)
-               {
-                       LibDwarf = DW_DLV_NO_ENTRY;
-                       return  true;
-               }
-               else
-               {
-                       return  false;
-               }
-       }
-       else
-       {
-               return  true;
-       }
-}
-
-
-// Dwarf manager Compilation Units close
-void DWARFManager_CloseDMI(void)
-{
-       while (NbCU--)
-       {
-               free(PtrCU[NbCU].PtrFullFilename);
-               free(PtrCU[NbCU].PtrLoadSrc);
-               free(PtrCU[NbCU].PtrProducer);
-
-               while (PtrCU[NbCU].NbLinesLoadSrc--)
-               {
-                       free(PtrCU[NbCU].PtrLinesLoadSrc[PtrCU[NbCU].NbLinesLoadSrc]);
-               }
-               free(PtrCU[NbCU].PtrLinesLoadSrc);
-
-               while (PtrCU[NbCU].NbSubProgs--)
-               {
-                       free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc);
-                       free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrSubprogramName);
-               }
-               free(PtrCU[NbCU].PtrSubProgs);
-
-               while (PtrCU[NbCU].NbTypes--)
-               {
-                       free(PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrName);
-               }
-               free(PtrCU[NbCU].PtrTypes);
-
-               while (PtrCU[NbCU].NbVariables--)
-               {
-                       free(PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName);
-                       free(PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrTypeName);
-               }
-               free(PtrCU[NbCU].PtrVariables);
-       }
-
-       free(PtrCU);
-}
-
-
-// Dwarf manager Compilation Units initialisations
-void DWARFManager_InitDMI(void)
-{
-       Dwarf_Unsigned  next_cu_header, return_uvalue;
-       Dwarf_Error     error;
-       Dwarf_Attribute *atlist;
-       Dwarf_Attribute return_attr1;
-       Dwarf_Half return_tagval, return_attr;
-       Dwarf_Addr return_lowpc, return_highpc, return_lineaddr;
-       Dwarf_Block *return_block;
-       Dwarf_Signed atcnt, cnt;
-       Dwarf_Die return_sib, return_die;
-       Dwarf_Off return_offset;
-       Dwarf_Line *linebuf;
-       FILE *SrcFile;
-       size_t i, j, k, TypeOffset;
-       char *return_string;
-       char *Ptr;
-       char *SourceFilename = NULL;
-       char *SourceFileDirectory = NULL;
-       char *SourceFullFilename = NULL;
-
-       // Initialisation for the Compilation Units table
-       NbCU = 0;
-       PtrCU = NULL;
-
-       // loop on the available Compilation Unit
-       while (dwarf_next_cu_header(dbg, NULL, NULL, NULL, NULL, &next_cu_header, &error) == DW_DLV_OK)
-       {
-               // Allocation of an additional Compilation Unit structure in the table
-               if (Ptr = (char *)realloc(PtrCU, ((NbCU + 1) * sizeof(CUStruct))))
-               {
-                       // Compilation Unit RAZ
-                       PtrCU = (CUStruct *)Ptr;
-                       memset(PtrCU + NbCU, 0, sizeof(CUStruct));
-
-                       // Get 1st Die from the Compilation Unit
-                       if (dwarf_siblingof(dbg, NULL, &return_sib, &error) == DW_DLV_OK)
-                       {
-                               // Get Die's Tag
-                               if ((dwarf_tag(return_sib, &return_tagval, &error) == DW_DLV_OK))
-                               {
-                                       PtrCU[NbCU].Tag = return_tagval;
-
-                                       // Die type detection
-                                       switch (return_tagval)
-                                       {
-                                       case    DW_TAG_compile_unit:
-                                               if (dwarf_attrlist(return_sib, &atlist, &atcnt, &error) == DW_DLV_OK)
-                                               {
-                                                       for (Dwarf_Signed i = 0; i < atcnt; ++i)
-                                                       {
-                                                               if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)
-                                                               {
-                                                                       switch (return_attr)
-                                                                       {
-                                                                       case    DW_AT_low_pc:
-                                                                               if (dwarf_lowpc(return_sib, &return_lowpc, &error) == DW_DLV_OK)
-                                                                               {
-                                                                                       PtrCU[NbCU].LowPC = return_lowpc;
-                                                                               }
-                                                                               break;
-
-                                                                       case    DW_AT_high_pc:
-                                                                               if (dwarf_highpc(return_sib, &return_highpc, &error) == DW_DLV_OK)
-                                                                               {
-                                                                                       PtrCU[NbCU].HighPC = return_highpc;
-                                                                               }
-                                                                               break;
-
-                                                                       case    DW_AT_producer:
-                                                                               if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK)
-                                                                               {
-                                                                                       PtrCU[NbCU].PtrProducer = (char *)calloc(strlen(return_string) + 1, 1);
-                                                                                       strcpy(PtrCU[NbCU].PtrProducer, return_string);
-                                                                                       dwarf_dealloc(dbg, return_string, DW_DLA_STRING);
-                                                                               }
-                                                                               break;
-
-                                                                       case    DW_AT_name:
-                                                                               if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK)
-                                                                               {
-                                                                                       SourceFilename = (char *)realloc(SourceFilename, strlen(return_string) + 1);
-                                                                                       strcpy(SourceFilename, return_string);
-                                                                                       dwarf_dealloc(dbg, return_string, DW_DLA_STRING);
-                                                                               }
-                                                                               break;
-
-                                                                       case    DW_AT_comp_dir:
-                                                                               if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK)
-                                                                               {
-                                                                                       SourceFileDirectory = (char *)realloc(SourceFileDirectory, strlen(return_string) + 1);
-                                                                                       strcpy(SourceFileDirectory, return_string);
-                                                                                       dwarf_dealloc(dbg, return_string, DW_DLA_STRING);
-                                                                               }
-                                                                               break;
-
-                                                                       default:
-                                                                               break;
-                                                                       }
-                                                               }
-                                                               dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);
-                                                       }
-                                                       dwarf_dealloc(dbg, atlist, DW_DLA_LIST);
-                                               }
-
-                                               Ptr = SourceFullFilename = (char *)realloc(SourceFullFilename, strlen(SourceFilename) + strlen(SourceFileDirectory) + 2);
-                                               sprintf(SourceFullFilename, "%s\\%s", SourceFileDirectory, SourceFilename);
-                                               while (*Ptr)
-                                               {
-                                                       if (*Ptr == '/')
-                                                       {
-                                                               *Ptr = '\\';
-                                                       }
-                                                       Ptr++;
-                                               }
-                                               PtrCU[NbCU].PtrFullFilename = (char *)calloc(strlen(SourceFullFilename) + 1, 1);
-                                               strcpy((char *)PtrCU[NbCU].PtrFullFilename, SourceFullFilename);
-
-#ifndef __CYGWIN__
-                                               if (!fopen_s(&SrcFile, SourceFullFilename, "rt"))
-#else
-                                               if (!(SrcFile = fopen(SourceFullFilename, "rt")))
-#endif
-                                               {
-                                                       if (!fseek(SrcFile, 0, SEEK_END))
-                                                       {
-                                                               if ((PtrCU[NbCU].SizeLoadSrc = ftell(SrcFile)) > 0)
-                                                               {
-                                                                       if (PtrCU[NbCU].PtrLoadSrc = Ptr = (char *)calloc((PtrCU[NbCU].SizeLoadSrc + 1), 1))
-                                                                       {
-                                                                               rewind(SrcFile);
-                                                                               if (PtrCU[NbCU].SizeLoadSrc < fread(Ptr, 1, PtrCU[NbCU].SizeLoadSrc, SrcFile))
-                                                                               {
-                                                                                       free(PtrCU[NbCU].PtrLoadSrc);
-                                                                                       PtrCU[NbCU].PtrLoadSrc = NULL;
-                                                                                       PtrCU[NbCU].SizeLoadSrc = 0;
-                                                                               }
-                                                                               else
-                                                                               {
-                                                                                       do
-                                                                                       {
-                                                                                               if (*Ptr == 0xa)
-                                                                                               {
-                                                                                                       PtrCU[NbCU].NbLinesLoadSrc++;
-                                                                                                       *Ptr = 0;
-                                                                                               }
-                                                                                       } while (*++Ptr);
-                                                                               }
-                                                                       }
-                                                               }
-                                                       }
-                                                       fclose(SrcFile);
-                                               }
-                                               break;
-
-                                       default:
-                                               break;
-                                       }
-                               }
-
-                               // Get the source lines table located in the Compilation Unit
-                               if (dwarf_srclines(return_sib, &linebuf, &cnt, &error) == DW_DLV_OK)
-                               {
-                               }
-
-                               if (dwarf_child(return_sib, &return_die, &error) == DW_DLV_OK)
-                               {
-                                       do
-                                       {
-                                               return_sib = return_die;
-                                               if ((dwarf_tag(return_die, &return_tagval, &error) == DW_DLV_OK))
-                                               {
-                                                       switch (return_tagval)
-                                                       {
-                                                       case    DW_TAG_lexical_block:
-                                                               break;
-
-                                                       case    DW_TAG_variable:
-                                                               if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK)
-                                                               {
-                                                                       PtrCU[NbCU].PtrVariables = (VariablesStruct *)realloc(PtrCU[NbCU].PtrVariables, ((PtrCU[NbCU].NbVariables + 1) * sizeof(VariablesStruct)));
-                                                                       memset(PtrCU[NbCU].PtrVariables + PtrCU[NbCU].NbVariables, 0, sizeof(VariablesStruct));
-
-                                                                       for (Dwarf_Signed i = 0; i < atcnt; ++i)
-                                                                       {
-                                                                               if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)
-                                                                               {
-                                                                                       if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK)
-                                                                                       {
-                                                                                               switch (return_attr)
-                                                                                               {
-                                                                                               case    DW_AT_location:
-                                                                                                       if (dwarf_formblock(return_attr1, &return_block, &error) == DW_DLV_OK)
-                                                                                                       {
-                                                                                                               if (return_block->bl_len == 5)
-                                                                                                               {
-                                                                                                                       PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].Addr = (*((unsigned char *)(return_block->bl_data) + 1) << 24) + (*((unsigned char *)(return_block->bl_data) + 2) << 16) + (*((unsigned char *)(return_block->bl_data) + 3) << 8) + (*((unsigned char *)(return_block->bl_data) + 4));
-                                                                                                               }
-                                                                                                               dwarf_dealloc(dbg, return_block, DW_DLA_BLOCK);
-                                                                                                       }
-                                                                                                       break;
-
-                                                                                               case    DW_AT_type:
-                                                                                                       if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK)
-                                                                                                       {
-                                                                                                               PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].TypeOffset = return_offset;
-                                                                                                       }
-                                                                                                       break;
-
-                                                                                               case    DW_AT_name:
-                                                                                                       if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)
-                                                                                                       {
-                                                                                                               PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName = (char *)calloc(strlen(return_string) + 1, 1);
-                                                                                                               strcpy(PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName, return_string);
-                                                                                                               dwarf_dealloc(dbg, return_string, DW_DLA_STRING);
-                                                                                                       }
-                                                                                                       break;
-
-                                                                                               default:
-                                                                                                       break;
-                                                                                               }
-                                                                                       }
-                                                                               }
-
-                                                                               dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);
-                                                                       }
-
-                                                                       PtrCU[NbCU].NbVariables++;
-
-                                                                       dwarf_dealloc(dbg, atlist, DW_DLA_LIST);
-                                                               }
-                                                               break;
-
-                                                       case    DW_TAG_base_type:
-                                                       case    DW_TAG_typedef:
-                                                       case    DW_TAG_structure_type:
-                                                       case    DW_TAG_pointer_type:
-                                                       case    DW_TAG_const_type:
-                                                       case    DW_TAG_array_type:
-                                                       case    DW_TAG_subrange_type:
-                                                       case    DW_TAG_subroutine_type:
-                                                               if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK)
-                                                               {
-                                                                       PtrCU[NbCU].PtrTypes = (BaseTypeStruct *)realloc(PtrCU[NbCU].PtrTypes, ((PtrCU[NbCU].NbTypes + 1) * sizeof(BaseTypeStruct)));
-                                                                       memset(PtrCU[NbCU].PtrTypes + PtrCU[NbCU].NbTypes, 0, sizeof(BaseTypeStruct));
-                                                                       PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Tag = return_tagval;
-
-                                                                       if (dwarf_dieoffset(return_die, &return_offset, &error) == DW_DLV_OK)
-                                                                       {
-                                                                               PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Offset = return_offset;
-                                                                       }
-
-                                                                       for (Dwarf_Signed i = 0; i < atcnt; ++i)
-                                                                       {
-                                                                               if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)
-                                                                               {
-                                                                                       if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK)
-                                                                                       {
-                                                                                               switch (return_attr)
-                                                                                               {
-                                                                                               case    DW_AT_type:
-                                                                                                       if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK)
-                                                                                                       {
-                                                                                                               PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].TypeOffset = return_offset;
-                                                                                                       }
-                                                                                                       break;
-
-                                                                                               case    DW_AT_byte_size:
-                                                                                                       if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)
-                                                                                                       {
-                                                                                                               PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].ByteSize = return_uvalue;
-                                                                                                       }
-                                                                                                       break;
-
-                                                                                               case    DW_AT_encoding:
-                                                                                                       if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)
-                                                                                                       {
-                                                                                                               PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Encoding = return_uvalue;
-                                                                                                       }
-                                                                                                       break;
-
-                                                                                               case    DW_AT_name:
-                                                                                                       if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)
-                                                                                                       {
-                                                                                                               PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrName = (char *)calloc(strlen(return_string) + 1, 1);
-                                                                                                               strcpy(PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrName, return_string);
-                                                                                                               dwarf_dealloc(dbg, return_string, DW_DLA_STRING);
-                                                                                                       }
-                                                                                                       break;
-
-                                                                                               default:
-                                                                                                       break;
-                                                                                               }
-                                                                                       }
-                                                                               }
-
-                                                                               dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);
-                                                                       }
-
-                                                                       PtrCU[NbCU].NbTypes++;
-
-                                                                       dwarf_dealloc(dbg, atlist, DW_DLA_LIST);
-                                                               }
-                                                               break;
-
-                                                       case    DW_TAG_subprogram:
-                                                               if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK)
-                                                               {
-                                                                       PtrCU[NbCU].PtrSubProgs = (SubProgStruct *)realloc(PtrCU[NbCU].PtrSubProgs, ((PtrCU[NbCU].NbSubProgs + 1) * sizeof(SubProgStruct)));
-                                                                       memset((void *)(PtrCU[NbCU].PtrSubProgs + PtrCU[NbCU].NbSubProgs), 0, sizeof(SubProgStruct));
-                                                                       PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].Tag = return_tagval;
-
-                                                                       for (Dwarf_Signed i = 0; i < atcnt; ++i)
-                                                                       {
-                                                                               if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)
-                                                                               {
-                                                                                       if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK)
-                                                                                       {
-                                                                                               switch (return_attr)
-                                                                                               {
-                                                                                               case    DW_AT_low_pc:
-                                                                                                       if (dwarf_lowpc(return_die, &return_lowpc, &error) == DW_DLV_OK)
-                                                                                                       {
-                                                                                                               PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].StartPC = return_lowpc;
-                                                                                                               PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].LowPC = return_lowpc;
-                                                                                                       }
-                                                                                                       break;
-
-                                                                                               case    DW_AT_high_pc:
-                                                                                                       if (dwarf_highpc(return_die, &return_highpc, &error) == DW_DLV_OK)
-                                                                                                       {
-                                                                                                               PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].HighPC = return_highpc;
-                                                                                                       }
-                                                                                               break;
-
-                                                                                               case    DW_AT_decl_line:
-                                                                                                       if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)
-                                                                                                       {
-                                                                                                               PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NumLineSrc = return_uvalue;
-                                                                                                       }
-                                                                                               break;
-
-                                                                                               case    DW_AT_name:
-                                                                                                       if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)
-                                                                                                       {
-                                                                                                               PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrSubprogramName = (char *)calloc(strlen(return_string) + 1, 1);
-                                                                                                               strcpy(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrSubprogramName, return_string);
-                                                                                                               dwarf_dealloc(dbg, return_string, DW_DLA_STRING);
-                                                                                                       }
-                                                                                                       break;
-
-                                                                                               default:
-                                                                                                       break;
-                                                                                               }
-                                                                                       }
-                                                                               }
-                                                                               dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);
-                                                                       }
-                                                                       dwarf_dealloc(dbg, atlist, DW_DLA_LIST);
-
-                                                                       for (i = 0; i < (size_t)cnt; ++i)
-                                                                       {
-                                                                               if (dwarf_lineaddr(linebuf[i], &return_lineaddr, &error) == DW_DLV_OK)
-                                                                               {
-                                                                                       if (dwarf_lineno(linebuf[i], &return_uvalue, &error) == DW_DLV_OK)
-                                                                                       {
-                                                                                               if ((return_lineaddr >= return_lowpc) && (return_lineaddr <= return_highpc))
-                                                                                               {
-                                                                                                       PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc = (DMIStruct_LineSrc *)realloc(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc, (PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc + 1) * sizeof(DMIStruct_LineSrc));
-                                                                                                       memset((void *)(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc), 0, sizeof(DMIStruct_LineSrc));
-                                                                                                       PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc].StartPC = return_lineaddr;
-                                                                                                       PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc].NumLineSrc = return_uvalue;
-                                                                                                       PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc++;
-                                                                                               }
-                                                                                       }
-                                                                               }                                                               
-                                                                       }
-                                                                                               
-                                                                       PtrCU[NbCU].NbSubProgs++;
-                                                               }
-                                                               break;
-
-                                                       default:
-                                                               break;
-                                                       }
-                                               }
-                                       }
-                                       while (dwarf_siblingof(dbg, return_sib, &return_die, &error) == DW_DLV_OK);
-                               }
-
-                               // Release the memory used by the source lines
-                               for (i = 0; i < (size_t)cnt; ++i)
-                                       dwarf_dealloc(dbg, linebuf[i], DW_DLA_LINE);
-                               dwarf_dealloc(dbg, linebuf, DW_DLA_LIST);
-                       }
-
-                       // Set the source code lines for QT html/text conformity
-                       if (PtrCU[NbCU].NbLinesLoadSrc)
-                       {
-                               if (PtrCU[NbCU].PtrLinesLoadSrc = (char **)calloc(PtrCU[NbCU].NbLinesLoadSrc, sizeof(char *)))
-                               {
-                                       for (j = 0; j < PtrCU[NbCU].NbLinesLoadSrc; j++)
-                                       {
-                                               if (PtrCU[NbCU].PtrLinesLoadSrc[j] = (char *)calloc(10000, sizeof(char)))
-                                               {
-                                                       if (Ptr = DWARFManager_GetLineSrcFromNumLine(PtrCU[NbCU].PtrLoadSrc, (j + 1)))
-                                                       {
-                                                               i = 0;
-
-                                                               while (*Ptr)
-                                                               {
-                                                                       switch (*Ptr)
-                                                                       {
-                                                                       case 9:
-                                                                               strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "&nbsp;");
-                                                                               i += strlen("&nbsp;");
-                                                                               break;
-
-                                                                       case '<':
-                                                                               strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "&lt;");
-                                                                               i += strlen("&lt;");
-                                                                               break;
-
-                                                                       case '>':
-                                                                               strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "&gt;");
-                                                                               i += strlen("&gt;");
-                                                                               break;
-#if 0
-                                                                       case '&':
-                                                                               strcpy(PtrCU[NbCU].PtrLinesLoadSrc[j], "&amp;");
-                                                                               i += strlen("&amp;");
-                                                                               break;
-#endif
-#if 0
-                                                                       case '"':
-                                                                               strcpy(PtrCU[NbCU].PtrLinesLoadSrc[j], "&quot;");
-                                                                               i += strlen("&quot;");
-                                                                               break;
-#endif
-                                                                       default:
-                                                                               PtrCU[NbCU].PtrLinesLoadSrc[j][i++] = *Ptr;
-                                                                               break;
-                                                                       }
-                                                                       Ptr++;
-                                                               }
-                                                       }
-                                                       PtrCU[NbCU].PtrLinesLoadSrc[j] = (char *)realloc(PtrCU[NbCU].PtrLinesLoadSrc[j], i + 1);
-                                               }
-                                       }
-                               }
-                       }
-                       else
-                       {
-                               // Set each source lines pointer to NULL
-                               i = PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].NbLinesSrc - 1].NumLineSrc;
-                               if (PtrCU[NbCU].PtrLinesLoadSrc = (char **)calloc(i, sizeof(char *)))
-                               {
-                                       for (j = 0; j < i; j++)
-                                       {
-                                               PtrCU[NbCU].PtrLinesLoadSrc[j] = NULL;
-                                       }
-                               }
-                       }
-
-                       // Init lines source information based on each source code line numbers
-                       for (j = 0; j < PtrCU[NbCU].NbSubProgs; j++)
-                       {
-                               PtrCU[NbCU].PtrSubProgs[j].PtrLineSrc = PtrCU[NbCU].PtrLinesLoadSrc[PtrCU[NbCU].PtrSubProgs[j].NumLineSrc - 1];
-
-                               for (k = 0; k < PtrCU[NbCU].PtrSubProgs[j].NbLinesSrc; k++)
-                               {
-                                       PtrCU[NbCU].PtrSubProgs[j].PtrLinesSrc[k].PtrLineSrc = PtrCU[NbCU].PtrLinesLoadSrc[PtrCU[NbCU].PtrSubProgs[j].PtrLinesSrc[k].NumLineSrc - 1];
-                               }
-                       }
-
-                       // Init variables information based on types information
-                       for (i = 0; i < PtrCU[NbCU].NbVariables; i++)
-                       {
-                               PtrCU[NbCU].PtrVariables[i].PtrTypeName = (char *)calloc(1000, 1);
-                               TypeOffset = PtrCU[NbCU].PtrVariables[i].TypeOffset;
-
-                               for (j = 0; j < PtrCU[NbCU].NbTypes; j++)
-                               {
-                                       if (TypeOffset == PtrCU[NbCU].PtrTypes[j].Offset)
-                                       {
-                                               switch (PtrCU[NbCU].PtrTypes[j].Tag)
-                                               {
-                                               case DW_TAG_structure_type:
-                                                       PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x1;
-                                                       if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))
-                                                       {
-                                                               j = -1;
-                                                       }
-                                                       else
-                                                       {
-                                                               if ((PtrCU[NbCU].PtrVariables[i].TypeTag & 0x2))
-                                                               {
-                                                                       strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, " *");
-                                                               }
-                                                       }
-                                                       break;
-
-                                               case DW_TAG_pointer_type:
-                                                       PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x2;
-                                                       PtrCU[NbCU].PtrVariables[i].TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize;
-                                                       PtrCU[NbCU].PtrVariables[i].TypeEncoding = 0x10;
-                                                       if (!(TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))
-                                                       {
-                                                               strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, "void *");
-                                                       }
-                                                       else
-                                                       {
-                                                               j = -1;
-                                                       }
-                                                       break;
-
-                                               case DW_TAG_typedef:
-                                                       PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x20;
-                                                       strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName);
-                                                       if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))
-                                                       {
-                                                               j = -1;
-                                                       }
-                                                       break;
-
-                                               case DW_TAG_subrange_type:
-                                                       PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x4;
-                                                       break;
-
-                                               case DW_TAG_array_type:
-                                                       PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x8;
-                                                       if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))
-                                                       {
-                                                               j = -1;
-                                                       }
-                                                       break;
-
-                                               case DW_TAG_const_type:
-                                                       PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x10;
-                                                       strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, "const ");
-                                                       if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))
-                                                       {
-                                                               j = -1;
-                                                       }
-                                                       break;
-
-                                               case DW_TAG_base_type:
-                                                       strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName);
-                                                       if ((PtrCU[NbCU].PtrVariables[i].TypeTag & 0x2))
-                                                       {
-                                                               strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, " *");
-                                                       }
-                                                       else
-                                                       {
-                                                               PtrCU[NbCU].PtrVariables[i].TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize;
-                                                               PtrCU[NbCU].PtrVariables[i].TypeEncoding = PtrCU[NbCU].PtrTypes[j].Encoding;
-                                                       }
-                                                       if ((PtrCU[NbCU].PtrVariables[i].TypeTag & 0x8))
-                                                       {
-                                                               strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, "[]");
-                                                       }
-                                                       break;
-
-                                               default:
-                                                       break;
-                                               }
-                                       }
-                               }
-                       }
-
-                       ++NbCU;
-               }
-       } 
-
-       free(SourceFilename);
-       free(SourceFileDirectory);
-       free(SourceFullFilename);
-}
-
-
-// Get symbol name based from address
-// Return NULL if no symbol name exists
-char *DWARFManager_GetSymbolnameFromAdr(size_t Adr)
-{
-       size_t i, j;
-
-       for (i = 0; i < NbCU; i++)
-       {
-               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))
-               {
-                       for (j = 0; (j < PtrCU[i].NbSubProgs); j++)
-                       {
-                               if ((PtrCU[i].PtrSubProgs[j].StartPC == Adr))
-                               {
-                                       return PtrCU[i].PtrSubProgs[j].PtrSubprogramName;
-                               }
-                       }
-               }
-       }
-
-       return NULL;
-}
-
-
-// Get complete source filename based from address
-// Return NULL if no source filename exists
-// Return the existence status (true or false) in Error
-char *DWARFManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error)
-{
-       size_t i;
-
-       for (i = 0; i < NbCU; i++)
-       {
-               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))
-               {
-                       *Error = PtrCU[i].PtrLoadSrc ? true : false;
-                       return PtrCU[i].PtrFullFilename;
-               }
-       }
-
-       return  NULL;
-}
-
-
-// Get text line source based on line number (starting by 1)
-// Return NULL if no text line exists or if line number is 0
-char *DWARFManager_GetLineSrcFromNumLine(char *PtrSrcFile, size_t NumLine)
-{
-       size_t i = 0;
-       char *PtrLineSrc = NULL;
-
-       if (PtrSrcFile)
-       {
-               while (i != NumLine)
-               {
-                       PtrLineSrc = PtrSrcFile;
-                       while (*PtrSrcFile++);
-                       i++;
-               }
-       }
-
-       return PtrLineSrc;
-}
-
-
-// Get Compilation Unit / External variables numbers
-// Return variables number
-size_t DWARFManager_GetNbExternalVariables(void)
-{
-       size_t NbVariables = 0, i;
-
-       for (i = 0; i < NbCU; i++)
-       {
-               NbVariables += PtrCU[i].NbVariables;
-       }
-
-       return NbVariables;
-}
-
-
-// Get external variable type name based on his index (starting by 1)
-// Return NULL if not found
-// May return NULL if there is not type linked to the variable's index
-char *DWARFManager_GetExternalVariableTypeName(size_t Index)
-{
-       size_t i;
-
-       for (i = 0; i < NbCU; i++)
-       {
-               if (PtrCU[i].NbVariables)
-               {
-                       if (Index <= PtrCU[i].NbVariables)
-                       {
-                               return PtrCU[i].PtrVariables[Index - 1].PtrTypeName;
-                       }
-                       else
-                       {
-                               Index -= PtrCU[i].NbVariables;
-                       }
-               }
-       }
-
-       return NULL;
-}
-
-
-// Get external variable's type tag based on his index (starting by 1)
-// Return 0 if not found
-size_t DWARFManager_GetExternalVariableTypeTag(size_t Index)
-{
-       size_t i;
-
-       for (i = 0; i < NbCU; i++)
-       {
-               if (PtrCU[i].NbVariables)
-               {
-                       if (Index <= PtrCU[i].NbVariables)
-                       {
-                               return PtrCU[i].PtrVariables[Index - 1].TypeTag;
-                       }
-                       else
-                       {
-                               Index -= PtrCU[i].NbVariables;
-                       }
-               }
-       }
-
-       return 0;
-}
-
-
-// Get external variable byte size based on his index (starting by 1)
-// Return 0 if not found
-size_t DWARFManager_GetExternalVariableTypeByteSize(size_t Index)
-{
-       size_t i;
-
-       for (i = 0; i < NbCU; i++)
-       {
-               if (PtrCU[i].NbVariables)
-               {
-                       if (Index <= PtrCU[i].NbVariables)
-                       {
-                               return PtrCU[i].PtrVariables[Index - 1].TypeByteSize;
-                       }
-                       else
-                       {
-                               Index -= PtrCU[i].NbVariables;
-                       }
-               }
-       }
-
-       return 0;
-}
-
-
-// Get external variable encoding based on his index (starting by 1)
-// Return 0 if not found
-size_t DWARFManager_GetExternalVariableTypeEncoding(size_t Index)
-{
-       size_t i;
-
-       for (i = 0; i < NbCU; i++)
-       {
-               if (PtrCU[i].NbVariables)
-               {
-                       if (Index <= PtrCU[i].NbVariables)
-                       {
-                               return PtrCU[i].PtrVariables[Index - 1].TypeEncoding;
-                       }
-                       else
-                       {
-                               Index -= PtrCU[i].NbVariables;
-                       }
-               }
-       }
-
-       return 0;
-}
-
-
-// Get external variable address based on his index (starting by 1)
-// Return 0 if not found
-size_t DWARFManager_GetExternalVariableAdr(size_t Index)
-{
-       size_t i;
-
-       for (i = 0; i < NbCU; i++)
-       {
-               if (PtrCU[i].NbVariables)
-               {
-                       if (Index <= PtrCU[i].NbVariables)
-                       {
-                               return PtrCU[i].PtrVariables[Index - 1].Addr;
-                       }
-                       else
-                       {
-                               Index -= PtrCU[i].NbVariables;
-                       }
-               }
-       }
-
-       return 0;
-}
-
-
-// Get external variable memory address based on his name
-// Return 0 if not found
-// Note: Return the first occurence found
-size_t DWARFManager_GetExternalVariableAdrFromName(char *VariableName)
-{
-       size_t i, j;
-
-       for (i = 0; i < NbCU; i++)
-       {
-               if (PtrCU[i].NbVariables)
-               {
-                       for (j = 0; j < PtrCU[i].NbVariables; j++)
-                       {
-                               if (!strcmp(PtrCU[i].PtrVariables[j].PtrName,VariableName))
-                               {
-                                       return PtrCU[i].PtrVariables[j].Addr;
-                               }
-                       }
-               }
-       }
-
-       return 0;
-}
-
-
-// Get external variable name based on his index (starting by 1)
-// Return name's pointer text found
-// Return NULL if not found
-char *DWARFManager_GetExternalVariableName(size_t Index)
-{
-       size_t i;
-
-       for (i = 0; i < NbCU; i++)
-       {
-               if (PtrCU[i].NbVariables)
-               {
-                       if (Index <= PtrCU[i].NbVariables)
-                       {
-                               return PtrCU[i].PtrVariables[Index - 1].PtrName;
-                       }
-                       else
-                       {
-                               Index -= PtrCU[i].NbVariables;
-                       }
-               }
-       }
-
-       return NULL;
-}
-
-
-// Get text line from source based on address and his tag
-// Return NULL if no text line has been found
-char *DWARFManager_GetLineSrcFromAdr(size_t Adr, size_t Tag)
-{
-       size_t i, j, k;
-
-       for (i = 0; i < NbCU; i++)
-       {
-               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))
-               {
-                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)
-                       {
-                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))
-                               {
-                                       if ((PtrCU[i].PtrSubProgs[j].StartPC == Adr) && (!Tag || (Tag == DW_TAG_subprogram)))
-                                       {
-                                               return PtrCU[i].PtrSubProgs[j].PtrLineSrc;
-                                       }
-                                       else
-                                       {
-                                               for (k = 0; k < PtrCU[i].PtrSubProgs[j].NbLinesSrc; k++)
-                                               {
-                                                       if ((PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].StartPC == Adr) && (!Tag || (PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].Tag == Tag)))
-                                                       {
-                                                               return PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].PtrLineSrc;
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
-
-       return  NULL;
-}
-
-
-// Get line number based on the address and the tag
-// Return 0 if no line number has been found
-size_t DWARFManager_GetNumLineFromAdr(size_t Adr, size_t Tag)
-{
-       size_t i, j, k;
-
-       for (i = 0; i < NbCU; i++)
-       {
-               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))
-               {
-                       for (j = 0; (j < PtrCU[i].NbSubProgs); j++)
-                       {
-                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))
-                               {
-                                       if ((PtrCU[i].PtrSubProgs[j].StartPC == Adr) && (!Tag || (Tag == DW_TAG_subprogram)))
-                                       {
-                                               return PtrCU[i].PtrSubProgs[j].NumLineSrc;
-                                       }
-                                       else
-                                       {
-                                               for (k = 0; (k < PtrCU[i].PtrSubProgs[j].NbLinesSrc); k++)
-                                               {
-                                                       if ((PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].StartPC == Adr) && (!Tag || (PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].Tag == Tag)))
-                                                       {
-                                                               return PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].NumLineSrc;
-                                                       }
-                                               }
-                                       }
-#if 0
-                                       if (!Tag || (Tag == DW_TAG_subprogram))
-                                       {
-                                               return PtrCU[i].PtrSubProgs[j].NumLineSrc;
-                                       }
-#endif
-                               }
-                       }
-               }
-       }
-
-       return  0;
-}
-
-
-// Get text line from source based on address and num line (starting by 1)
-// Return NULL if no text line has been found
-char *DWARFManager_GetLineSrcFromAdrNumLine(size_t Adr, size_t NumLine)
-{
-       size_t i, j, k;
-
-       for (i = 0; i < NbCU; i++)
-       {
-               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))
-               {
-                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)
-                       {
-                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))
-                               {
-                                       if (PtrCU[i].PtrSubProgs[j].NumLineSrc == NumLine)
-                                       {
-                                               return PtrCU[i].PtrSubProgs[j].PtrLineSrc;
-                                       }
-                                       else
-                                       {
-                                               for (k = 0; k < PtrCU[i].PtrSubProgs[j].NbLinesSrc; k++)
-                                               {
-                                                       if (PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].NumLineSrc == NumLine)
-                                                       {
-                                                               return PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].PtrLineSrc;
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
-
-       return NULL;
-}
-
-
-// Get text line from source based on address and num line (starting by 1)
-// Return NULL if no text line has been found
-char *DWARFManager_GetLineSrcFromNumLineBaseAdr(size_t Adr, size_t NumLine)
-{
-       size_t i;
-
-       for (i = 0; i < NbCU; i++)
-       {
-               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))
-               {
-                       return PtrCU[i].PtrLinesLoadSrc[NumLine - 1];
-               }
-       }
-
-       return NULL;
-}
-
+//\r
+// DWARFManager.cpp: DWARF format manager\r
+//\r
+// by Jean-Paul Mari\r
+//\r
+// JPM = Jean-Paul Mari <djipi.mari@gmail.com>\r
+//\r
+// WHO  WHEN        WHAT\r
+// ---  ----------  ------------------------------------------------------------\r
+// JPM  12/03/2016  Created this file\r
+// JPM  12/03/2016  DWARF format support\r
+\r
+\r
+#include <stdlib.h>\r
+#include <stdio.h>\r
+#include <stdint.h>\r
+#include <string.h>\r
+#include <libdwarf.h>\r
+#include <dwarf.h>\r
+\r
+\r
+//\r
+//#define DEBUG_NumCU 0x6                                              // CU number to debug or undefine it\r
+//#define DEBUG_VariableName "argc"                            // Variable name to look for or undefine it\r
+\r
+\r
+// Source line internal structure\r
+struct DMIStruct_LineSrc\r
+{\r
+       size_t Tag;\r
+       size_t StartPC;\r
+       size_t NumLineSrc;\r
+       char *PtrLineSrc;\r
+}S_DMIStruct_LineSrc;\r
+\r
+// Base type internal structure\r
+struct BaseTypeStruct\r
+{\r
+       size_t Tag;                                                             // Type's Tag\r
+       size_t Offset;                                                  // Type's offset\r
+       size_t TypeOffset;                                              // Type's offset on another type\r
+       size_t ByteSize;                                                // Type's Byte Size\r
+       size_t Encoding;                                                // Type's encoding\r
+       char *PtrName;                                                  // Type's name\r
+}S_BaseTypeStruct;\r
+\r
+// Definitions for the variables's typetag\r
+#define        TypeTag_structure       0x01                    // structure\r
+#define        TypeTag_pointer         0x02                    // pointer\r
+#define        TypeTag_0x04            0x04\r
+#define        TypeTag_arraytype       0x08                    // array type\r
+#define        TypeTag_consttype       0x10                    // const type\r
+#define        TypeTag_typedef         0x20                    // typedef\r
+\r
+// Variables internal structure\r
+struct VariablesStruct\r
+{\r
+       size_t Op;                                                              // Variable's DW_OP\r
+       union\r
+       {\r
+               size_t Addr;                                            // Variable memory address\r
+               int Offset;                                                     // Variable stack offset (signed)\r
+       };\r
+       char *PtrName;                                                  // Variable's name\r
+       size_t TypeOffset;                                              // Offset pointing on the Variable's Type\r
+       size_t TypeByteSize;                                    // Variable's Type byte size\r
+       size_t TypeTag;                                                 // Variable's Type Tag\r
+       size_t TypeEncoding;                                    // Variable's Type encoding\r
+       char *PtrTypeName;                                              // Variable's Type name\r
+}S_VariablesStruct;\r
+\r
+// Sub program internal structure\r
+struct SubProgStruct\r
+{\r
+       size_t Tag;\r
+       size_t NumLineSrc;\r
+       size_t StartPC;\r
+       size_t LowPC, HighPC;\r
+       size_t FrameBase;\r
+       char *PtrLineSrc;\r
+       char *PtrSubprogramName;                                                // Sub program name\r
+       size_t NbLinesSrc;                                                              // Number of lines source used by the sub program\r
+       DMIStruct_LineSrc *PtrLinesSrc;                                 // Pointer of the lines source for the sub program\r
+       size_t NbVariables;                                                             // Variables number\r
+       VariablesStruct *PtrVariables;                                  // Pointer to the local variables list information structure\r
+}S_SubProgStruct;\r
+\r
+// Compilation Unit internal structure\r
+struct CUStruct\r
+{\r
+       size_t Tag;\r
+       size_t LowPC, HighPC;\r
+       char *PtrProducer;                                                              // Pointer to the "Producer" information (compiler and compilation options used)\r
+       char *PtrFullFilename;                                                  // Pointer to full namefile (directory & filename)\r
+       size_t SizeLoadSrc;                                                             // Source code size\r
+       char *PtrLoadSrc;                                                               // Pointer to loaded source code\r
+       size_t NbLinesLoadSrc;                                                  // Lines source number\r
+       char **PtrLinesLoadSrc;                                                 // Pointer lists to each source line put in QT html/text conformity\r
+       size_t NbSubProgs;                                                              // Number of sub programs / routines\r
+       SubProgStruct *PtrSubProgs;                                             // Pointer to the sub programs / routines information structure\r
+       size_t NbTypes;\r
+       BaseTypeStruct *PtrTypes;\r
+       size_t NbVariables;                                                             // Variables number\r
+       VariablesStruct *PtrVariables;                                  // Pointer to the global variables list information structure\r
+}S_CUStruct;\r
+\r
+\r
+// Dwarf management\r
+uint32_t LibDwarf;\r
+uint32_t NbCU;\r
+Dwarf_Ptr errarg;\r
+Dwarf_Error error;\r
+Dwarf_Debug dbg;\r
+CUStruct *PtrCU;\r
+\r
+\r
+//\r
+Dwarf_Handler DWARFManager_ErrorHandler(Dwarf_Ptr perrarg);\r
+void DWARFManager_InitDMI(void);\r
+void DWARFManager_CloseDMI(void);\r
+bool DWARFManager_ElfClose(void);\r
+char *DWARFManager_GetLineSrcFromNumLine(char *PtrSrcFile, size_t NumLine);\r
+void DWARFManager_InitInfosVariable(VariablesStruct *PtrVariables);\r
+\r
+\r
+//\r
+Dwarf_Handler DWARFManager_ErrorHandler(Dwarf_Ptr perrarg)\r
+{\r
+       return  0;\r
+}\r
+\r
+\r
+// Dwarf manager init\r
+void DWARFManager_Init(void)\r
+{\r
+       LibDwarf = DW_DLV_NO_ENTRY;\r
+}\r
+\r
+\r
+// Dwarf manager Reset\r
+bool DWARFManager_Reset(void)\r
+{\r
+       return DWARFManager_ElfClose();\r
+}\r
+\r
+\r
+// Dwarf manager Close\r
+bool DWARFManager_Close(void)\r
+{\r
+       return(DWARFManager_Reset());\r
+}\r
+\r
+\r
+// Dwarf manager Elf init\r
+int    DWARFManager_ElfInit(Elf *ElfPtr)\r
+{\r
+       if ((LibDwarf = dwarf_elf_init(ElfPtr, DW_DLC_READ, (Dwarf_Handler)DWARFManager_ErrorHandler, errarg, &dbg, &error)) == DW_DLV_OK)\r
+       {\r
+               DWARFManager_InitDMI();\r
+       }\r
+\r
+       return LibDwarf;\r
+}\r
+\r
+\r
+// Dwarf manager Elf close\r
+bool DWARFManager_ElfClose(void)\r
+{\r
+       if (LibDwarf == DW_DLV_OK)\r
+       {\r
+               DWARFManager_CloseDMI();\r
+\r
+               if (dwarf_finish(dbg, &error) == DW_DLV_OK)\r
+               {\r
+                       LibDwarf = DW_DLV_NO_ENTRY;\r
+                       return  true;\r
+               }\r
+               else\r
+               {\r
+                       return  false;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               return  true;\r
+       }\r
+}\r
+\r
+\r
+// Dwarf manager Compilation Units close\r
+void DWARFManager_CloseDMI(void)\r
+{\r
+       while (NbCU--)\r
+       {\r
+               free(PtrCU[NbCU].PtrFullFilename);\r
+               free(PtrCU[NbCU].PtrLoadSrc);\r
+               free(PtrCU[NbCU].PtrProducer);\r
+\r
+               while (PtrCU[NbCU].NbLinesLoadSrc--)\r
+               {\r
+                       free(PtrCU[NbCU].PtrLinesLoadSrc[PtrCU[NbCU].NbLinesLoadSrc]);\r
+               }\r
+               free(PtrCU[NbCU].PtrLinesLoadSrc);\r
+\r
+               while (PtrCU[NbCU].NbSubProgs--)\r
+               {\r
+                       while (PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables--)\r
+                       {\r
+                               free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].PtrName);\r
+                               free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].PtrTypeName);\r
+                       }\r
+                       free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables);\r
+\r
+                       free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc);\r
+                       free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrSubprogramName);\r
+               }\r
+               free(PtrCU[NbCU].PtrSubProgs);\r
+\r
+               while (PtrCU[NbCU].NbTypes--)\r
+               {\r
+                       free(PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrName);\r
+               }\r
+               free(PtrCU[NbCU].PtrTypes);\r
+\r
+               while (PtrCU[NbCU].NbVariables--)\r
+               {\r
+                       free(PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName);\r
+                       free(PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrTypeName);\r
+               }\r
+               free(PtrCU[NbCU].PtrVariables);\r
+       }\r
+\r
+       free(PtrCU);\r
+}\r
+\r
+\r
+// Dwarf manager Compilation Units initialisations\r
+void DWARFManager_InitDMI(void)\r
+{\r
+       Dwarf_Unsigned  next_cu_header, return_uvalue;\r
+       Dwarf_Error     error;\r
+       Dwarf_Attribute *atlist;\r
+       Dwarf_Attribute return_attr1;\r
+       Dwarf_Half return_tagval, return_attr;\r
+       Dwarf_Addr return_lowpc, return_highpc, return_lineaddr;\r
+       Dwarf_Block *return_block;\r
+       Dwarf_Signed atcnt, cnt;\r
+       Dwarf_Die return_sib, return_die, return_sub, return_subdie;\r
+       Dwarf_Off return_offset;\r
+       Dwarf_Line *linebuf;\r
+       FILE *SrcFile;\r
+       size_t i, j, k;\r
+       char *return_string;\r
+       char *Ptr;\r
+       char *SourceFilename = NULL;\r
+       char *SourceFileDirectory = NULL;\r
+       char *SourceFullFilename = NULL;\r
+\r
+       // Initialisation for the Compilation Units table\r
+       NbCU = 0;\r
+       PtrCU = NULL;\r
+\r
+       // loop on the available Compilation Unit\r
+       while (dwarf_next_cu_header(dbg, NULL, NULL, NULL, NULL, &next_cu_header, &error) == DW_DLV_OK)\r
+       {\r
+               // Allocation of an additional Compilation Unit structure in the table\r
+               if (Ptr = (char *)realloc(PtrCU, ((NbCU + 1) * sizeof(CUStruct))))\r
+               {\r
+                       // Compilation Unit RAZ\r
+                       PtrCU = (CUStruct *)Ptr;\r
+                       memset(PtrCU + NbCU, 0, sizeof(CUStruct));\r
+\r
+                       // Debug specific CU\r
+#ifdef DEBUG_NumCU\r
+                       if (NbCU == DEBUG_NumCU)\r
+#endif\r
+                       {\r
+                               // Get 1st Die from the Compilation Unit\r
+                               if (dwarf_siblingof(dbg, NULL, &return_sib, &error) == DW_DLV_OK)\r
+                               {\r
+                                       // Get Die's Tag\r
+                                       if ((dwarf_tag(return_sib, &return_tagval, &error) == DW_DLV_OK))\r
+                                       {\r
+                                               PtrCU[NbCU].Tag = return_tagval;\r
+\r
+                                               // Die type detection\r
+                                               switch (return_tagval)\r
+                                               {\r
+                                               case    DW_TAG_compile_unit:\r
+                                                       if (dwarf_attrlist(return_sib, &atlist, &atcnt, &error) == DW_DLV_OK)\r
+                                                       {\r
+                                                               for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
+                                                               {\r
+                                                                       if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)\r
+                                                                       {\r
+                                                                               switch (return_attr)\r
+                                                                               {\r
+                                                                               case    DW_AT_low_pc:\r
+                                                                                       if (dwarf_lowpc(return_sib, &return_lowpc, &error) == DW_DLV_OK)\r
+                                                                                       {\r
+                                                                                               PtrCU[NbCU].LowPC = return_lowpc;\r
+                                                                                       }\r
+                                                                                       break;\r
+\r
+                                                                               case    DW_AT_high_pc:\r
+                                                                                       if (dwarf_highpc(return_sib, &return_highpc, &error) == DW_DLV_OK)\r
+                                                                                       {\r
+                                                                                               PtrCU[NbCU].HighPC = return_highpc;\r
+                                                                                       }\r
+                                                                                       break;\r
+\r
+                                                                               case    DW_AT_producer:\r
+                                                                                       if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK)\r
+                                                                                       {\r
+                                                                                               PtrCU[NbCU].PtrProducer = (char *)calloc(strlen(return_string) + 1, 1);\r
+                                                                                               strcpy(PtrCU[NbCU].PtrProducer, return_string);\r
+                                                                                               dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
+                                                                                       }\r
+                                                                                       break;\r
+\r
+                                                                               case    DW_AT_name:\r
+                                                                                       if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK)\r
+                                                                                       {\r
+                                                                                               SourceFilename = (char *)realloc(SourceFilename, strlen(return_string) + 1);\r
+                                                                                               strcpy(SourceFilename, return_string);\r
+                                                                                               dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
+                                                                                       }\r
+                                                                                       break;\r
+\r
+                                                                               case    DW_AT_comp_dir:\r
+                                                                                       if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK)\r
+                                                                                       {\r
+                                                                                               SourceFileDirectory = (char *)realloc(SourceFileDirectory, strlen(return_string) + 1);\r
+                                                                                               strcpy(SourceFileDirectory, return_string);\r
+                                                                                               dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
+                                                                                       }\r
+                                                                                       break;\r
+\r
+                                                                               default:\r
+                                                                                       break;\r
+                                                                               }\r
+                                                                       }\r
+                                                                       dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);\r
+                                                               }\r
+                                                               dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
+                                                       }\r
+\r
+                                                       Ptr = SourceFullFilename = (char *)realloc(SourceFullFilename, strlen(SourceFilename) + strlen(SourceFileDirectory) + 2);\r
+                                                       sprintf(SourceFullFilename, "%s\\%s", SourceFileDirectory, SourceFilename);\r
+                                                       while (*Ptr)\r
+                                                       {\r
+                                                               if (*Ptr == '/')\r
+                                                               {\r
+                                                                       *Ptr = '\\';\r
+                                                               }\r
+                                                               Ptr++;\r
+                                                       }\r
+                                                       PtrCU[NbCU].PtrFullFilename = (char *)calloc(strlen(SourceFullFilename) + 1, 1);\r
+                                                       strcpy((char *)PtrCU[NbCU].PtrFullFilename, SourceFullFilename);\r
+\r
+#ifndef __CYGWIN__\r
+                                                       if (!fopen_s(&SrcFile, SourceFullFilename, "rt"))\r
+#else\r
+                                                       if (!(SrcFile = fopen(SourceFullFilename, "rt")))\r
+#endif\r
+                                                       {\r
+                                                               if (!fseek(SrcFile, 0, SEEK_END))\r
+                                                               {\r
+                                                                       if ((PtrCU[NbCU].SizeLoadSrc = ftell(SrcFile)) > 0)\r
+                                                                       {\r
+                                                                               if (PtrCU[NbCU].PtrLoadSrc = Ptr = (char *)calloc((PtrCU[NbCU].SizeLoadSrc + 1), 1))\r
+                                                                               {\r
+                                                                                       rewind(SrcFile);\r
+                                                                                       if (PtrCU[NbCU].SizeLoadSrc < fread(Ptr, 1, PtrCU[NbCU].SizeLoadSrc, SrcFile))\r
+                                                                                       {\r
+                                                                                               free(PtrCU[NbCU].PtrLoadSrc);\r
+                                                                                               PtrCU[NbCU].PtrLoadSrc = NULL;\r
+                                                                                               PtrCU[NbCU].SizeLoadSrc = 0;\r
+                                                                                       }\r
+                                                                                       else\r
+                                                                                       {\r
+                                                                                               do\r
+                                                                                               {\r
+                                                                                                       if (*Ptr == 0xa)\r
+                                                                                                       {\r
+                                                                                                               PtrCU[NbCU].NbLinesLoadSrc++;\r
+                                                                                                               *Ptr = 0;\r
+                                                                                                       }\r
+                                                                                               } while (*++Ptr);\r
+                                                                                       }\r
+                                                                               }\r
+                                                                       }\r
+                                                               }\r
+                                                               fclose(SrcFile);\r
+                                                       }\r
+                                                       break;\r
+\r
+                                               default:\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+\r
+                                       // Get the source lines table located in the Compilation Unit\r
+                                       if (dwarf_srclines(return_sib, &linebuf, &cnt, &error) == DW_DLV_OK)\r
+                                       {\r
+                                       }\r
+\r
+                                       // Check if the CU has child\r
+                                       if (dwarf_child(return_sib, &return_die, &error) == DW_DLV_OK)\r
+                                       {\r
+                                               do\r
+                                               {\r
+                                                       return_sib = return_die;\r
+                                                       if ((dwarf_tag(return_die, &return_tagval, &error) == DW_DLV_OK))\r
+                                                       {\r
+                                                               switch (return_tagval)\r
+                                                               {\r
+                                                               case    DW_TAG_lexical_block:\r
+                                                                       break;\r
+\r
+                                                               case    DW_TAG_variable:\r
+                                                                       if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK)\r
+                                                                       {\r
+                                                                               PtrCU[NbCU].PtrVariables = (VariablesStruct *)realloc(PtrCU[NbCU].PtrVariables, ((PtrCU[NbCU].NbVariables + 1) * sizeof(VariablesStruct)));\r
+                                                                               memset(PtrCU[NbCU].PtrVariables + PtrCU[NbCU].NbVariables, 0, sizeof(VariablesStruct));\r
+\r
+                                                                               for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
+                                                                               {\r
+                                                                                       if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)\r
+                                                                                       {\r
+                                                                                               if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK)\r
+                                                                                               {\r
+                                                                                                       switch (return_attr)\r
+                                                                                                       {\r
+                                                                                                       case    DW_AT_location:\r
+                                                                                                               if (dwarf_formblock(return_attr1, &return_block, &error) == DW_DLV_OK)\r
+                                                                                                               {\r
+                                                                                                                       PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].Op = (*((unsigned char *)(return_block->bl_data)));\r
+\r
+                                                                                                                       switch (return_block->bl_len)\r
+                                                                                                                       {\r
+                                                                                                                       case 5:\r
+                                                                                                                               PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].Addr = (*((unsigned char *)(return_block->bl_data) + 1) << 24) + (*((unsigned char *)(return_block->bl_data) + 2) << 16) + (*((unsigned char *)(return_block->bl_data) + 3) << 8) + (*((unsigned char *)(return_block->bl_data) + 4));\r
+                                                                                                                               break;\r
+\r
+                                                                                                                       default:\r
+                                                                                                                               break;\r
+                                                                                                                       }\r
+                                                                                                                       dwarf_dealloc(dbg, return_block, DW_DLA_BLOCK);\r
+                                                                                                               }\r
+                                                                                                               break;\r
+\r
+                                                                                                       case    DW_AT_type:\r
+                                                                                                               if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK)\r
+                                                                                                               {\r
+                                                                                                                       PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].TypeOffset = return_offset;\r
+                                                                                                               }\r
+                                                                                                               break;\r
+\r
+                                                                                                       case    DW_AT_name:\r
+                                                                                                               if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
+                                                                                                               {\r
+#ifdef DEBUG_VariableName\r
+                                                                                                                       if (!strcmp(return_string, DEBUG_VariableName))\r
+#endif\r
+                                                                                                                       {\r
+                                                                                                                               PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName = (char *)calloc(strlen(return_string) + 1, 1);\r
+                                                                                                                               strcpy(PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName, return_string);\r
+                                                                                                                               dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
+                                                                                                                       }\r
+                                                                                                               }\r
+                                                                                                               break;\r
+\r
+                                                                                                       default:\r
+                                                                                                               break;\r
+                                                                                                       }\r
+                                                                                               }\r
+                                                                                       }\r
+\r
+                                                                                       dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);\r
+                                                                               }\r
+\r
+                                                                               PtrCU[NbCU].NbVariables++;\r
+\r
+                                                                               dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
+                                                                       }\r
+                                                                       break;\r
+\r
+                                                               case    DW_TAG_base_type:\r
+                                                               case    DW_TAG_typedef:\r
+                                                               case    DW_TAG_structure_type:\r
+                                                               case    DW_TAG_pointer_type:\r
+                                                               case    DW_TAG_const_type:\r
+                                                               case    DW_TAG_array_type:\r
+                                                               case    DW_TAG_subrange_type:\r
+                                                               case    DW_TAG_subroutine_type:\r
+                                                                       if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK)\r
+                                                                       {\r
+                                                                               PtrCU[NbCU].PtrTypes = (BaseTypeStruct *)realloc(PtrCU[NbCU].PtrTypes, ((PtrCU[NbCU].NbTypes + 1) * sizeof(BaseTypeStruct)));\r
+                                                                               memset(PtrCU[NbCU].PtrTypes + PtrCU[NbCU].NbTypes, 0, sizeof(BaseTypeStruct));\r
+                                                                               PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Tag = return_tagval;\r
+\r
+                                                                               if (dwarf_dieoffset(return_die, &return_offset, &error) == DW_DLV_OK)\r
+                                                                               {\r
+                                                                                       PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Offset = return_offset;\r
+                                                                               }\r
+\r
+                                                                               for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
+                                                                               {\r
+                                                                                       if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)\r
+                                                                                       {\r
+                                                                                               if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK)\r
+                                                                                               {\r
+                                                                                                       switch (return_attr)\r
+                                                                                                       {\r
+                                                                                                       case    DW_AT_type:\r
+                                                                                                               if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK)\r
+                                                                                                               {\r
+                                                                                                                       PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].TypeOffset = return_offset;\r
+                                                                                                               }\r
+                                                                                                               break;\r
+\r
+                                                                                                       case    DW_AT_byte_size:\r
+                                                                                                               if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
+                                                                                                               {\r
+                                                                                                                       PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].ByteSize = return_uvalue;\r
+                                                                                                               }\r
+                                                                                                               break;\r
+\r
+                                                                                                       case    DW_AT_encoding:\r
+                                                                                                               if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
+                                                                                                               {\r
+                                                                                                                       PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Encoding = return_uvalue;\r
+                                                                                                               }\r
+                                                                                                               break;\r
+\r
+                                                                                                       case    DW_AT_name:\r
+                                                                                                               if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
+                                                                                                               {\r
+                                                                                                                       PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrName = (char *)calloc(strlen(return_string) + 1, 1);\r
+                                                                                                                       strcpy(PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrName, return_string);\r
+                                                                                                                       dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
+                                                                                                               }\r
+                                                                                                               break;\r
+\r
+                                                                                                       default:\r
+                                                                                                               break;\r
+                                                                                                       }\r
+                                                                                               }\r
+                                                                                       }\r
+\r
+                                                                                       dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);\r
+                                                                               }\r
+\r
+                                                                               PtrCU[NbCU].NbTypes++;\r
+\r
+                                                                               dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
+                                                                       }\r
+                                                                       break;\r
+\r
+                                                               case    DW_TAG_subprogram:\r
+                                                                       if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK)\r
+                                                                       {\r
+                                                                               PtrCU[NbCU].PtrSubProgs = (SubProgStruct *)realloc(PtrCU[NbCU].PtrSubProgs, ((PtrCU[NbCU].NbSubProgs + 1) * sizeof(SubProgStruct)));\r
+                                                                               memset((void *)(PtrCU[NbCU].PtrSubProgs + PtrCU[NbCU].NbSubProgs), 0, sizeof(SubProgStruct));\r
+                                                                               PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].Tag = return_tagval;\r
+\r
+                                                                               for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
+                                                                               {\r
+                                                                                       if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)\r
+                                                                                       {\r
+                                                                                               if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK)\r
+                                                                                               {\r
+                                                                                                       switch (return_attr)\r
+                                                                                                       {\r
+                                                                                                       case DW_AT_low_pc:\r
+                                                                                                               if (dwarf_lowpc(return_die, &return_lowpc, &error) == DW_DLV_OK)\r
+                                                                                                               {\r
+                                                                                                                       PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].StartPC = return_lowpc;\r
+                                                                                                                       PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].LowPC = return_lowpc;\r
+                                                                                                               }\r
+                                                                                                               break;\r
+\r
+                                                                                                       case DW_AT_high_pc:\r
+                                                                                                               if (dwarf_highpc(return_die, &return_highpc, &error) == DW_DLV_OK)\r
+                                                                                                               {\r
+                                                                                                                       PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].HighPC = return_highpc;\r
+                                                                                                               }\r
+                                                                                                               break;\r
+\r
+                                                                                                       case DW_AT_decl_line:\r
+                                                                                                               if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
+                                                                                                               {\r
+                                                                                                                       PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NumLineSrc = return_uvalue;\r
+                                                                                                               }\r
+                                                                                                               break;\r
+\r
+                                                                                                       case DW_AT_frame_base:\r
+                                                                                                               if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
+                                                                                                               {\r
+                                                                                                                       PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].FrameBase = return_uvalue;\r
+                                                                                                               }\r
+                                                                                                               break;\r
+\r
+                                                                                                       case DW_AT_name:\r
+                                                                                                               if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
+                                                                                                               {\r
+                                                                                                                       PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrSubprogramName = (char *)calloc(strlen(return_string) + 1, 1);\r
+                                                                                                                       strcpy(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrSubprogramName, return_string);\r
+                                                                                                                       dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
+                                                                                                               }\r
+                                                                                                               break;\r
+\r
+                                                                                                       default:\r
+                                                                                                               break;\r
+                                                                                                       }\r
+                                                                                               }\r
+                                                                                       }\r
+                                                                                       dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);\r
+                                                                               }\r
+                                                                               dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
+\r
+                                                                               for (i = 0; i < (size_t)cnt; ++i)\r
+                                                                               {\r
+                                                                                       if (dwarf_lineaddr(linebuf[i], &return_lineaddr, &error) == DW_DLV_OK)\r
+                                                                                       {\r
+                                                                                               if (dwarf_lineno(linebuf[i], &return_uvalue, &error) == DW_DLV_OK)\r
+                                                                                               {\r
+                                                                                                       if ((return_lineaddr >= return_lowpc) && (return_lineaddr <= return_highpc))\r
+                                                                                                       {\r
+                                                                                                               PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc = (DMIStruct_LineSrc *)realloc(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc, (PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc + 1) * sizeof(DMIStruct_LineSrc));\r
+                                                                                                               memset((void *)(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc), 0, sizeof(DMIStruct_LineSrc));\r
+                                                                                                               PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc].StartPC = return_lineaddr;\r
+                                                                                                               PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc].NumLineSrc = return_uvalue;\r
+                                                                                                               PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc++;\r
+                                                                                                       }\r
+                                                                                               }\r
+                                                                                       }\r
+                                                                               }\r
+\r
+                                                                               if (dwarf_child(return_die, &return_subdie, &error) == DW_DLV_OK)\r
+                                                                               {\r
+                                                                                       do\r
+                                                                                       {\r
+                                                                                               return_sub = return_subdie;\r
+                                                                                               if ((dwarf_tag(return_subdie, &return_tagval, &error) == DW_DLV_OK))\r
+                                                                                               {\r
+                                                                                                       switch (return_tagval)\r
+                                                                                                       {\r
+                                                                                                       case DW_TAG_formal_parameter:\r
+                                                                                                       case DW_TAG_variable:\r
+                                                                                                               if (dwarf_attrlist(return_subdie, &atlist, &atcnt, &error) == DW_DLV_OK)\r
+                                                                                                               {\r
+                                                                                                                       PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables = (VariablesStruct *)realloc(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables, ((PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables + 1) * sizeof(VariablesStruct)));\r
+                                                                                                                       memset(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables, 0, sizeof(VariablesStruct));\r
+\r
+                                                                                                                       for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
+                                                                                                                       {\r
+                                                                                                                               if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)\r
+                                                                                                                               {\r
+                                                                                                                                       if (dwarf_attr(return_subdie, return_attr, &return_attr1, &error) == DW_DLV_OK)\r
+                                                                                                                                       {\r
+                                                                                                                                               switch (return_attr)\r
+                                                                                                                                               {\r
+                                                                                                                                               case    DW_AT_location:\r
+                                                                                                                                                       if (dwarf_formblock(return_attr1, &return_block, &error) == DW_DLV_OK)\r
+                                                                                                                                                       {\r
+                                                                                                                                                               PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].Op = *((unsigned char *)(return_block->bl_data));\r
+\r
+                                                                                                                                                               switch (return_block->bl_len)\r
+                                                                                                                                                               {\r
+                                                                                                                                                               case 1:\r
+                                                                                                                                                                       break;\r
+\r
+                                                                                                                                                               case 2:\r
+                                                                                                                                                                       PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].Offset = *((char *)(return_block->bl_data) + 1);\r
+\r
+                                                                                                                                                                       if (return_tagval == DW_TAG_variable)\r
+                                                                                                                                                                       {\r
+                                                                                                                                                                               PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].Offset -= 0x80;\r
+                                                                                                                                                                       }\r
+                                                                                                                                                                       break;\r
+\r
+                                                                                                                                                               default:\r
+                                                                                                                                                                       break;\r
+                                                                                                                                                               }\r
+                                                                                                                                                               dwarf_dealloc(dbg, return_block, DW_DLA_BLOCK);\r
+                                                                                                                                                       }\r
+                                                                                                                                                       break;\r
+\r
+                                                                                                                                               case    DW_AT_type:\r
+                                                                                                                                                       if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK)\r
+                                                                                                                                                       {\r
+                                                                                                                                                               PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].TypeOffset = return_offset;\r
+                                                                                                                                                       }\r
+                                                                                                                                                       break;\r
+\r
+                                                                                                                                               case    DW_AT_name:\r
+                                                                                                                                                       if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
+                                                                                                                                                       {\r
+#ifdef DEBUG_VariableName\r
+                                                                                                                                                               if (!strcmp(return_string, DEBUG_VariableName))\r
+#endif\r
+                                                                                                                                                               {\r
+                                                                                                                                                                       PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].PtrName = (char *)calloc(strlen(return_string) + 1, 1);\r
+                                                                                                                                                                       strcpy(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].PtrName, return_string);\r
+                                                                                                                                                                       dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
+                                                                                                                                                               }\r
+                                                                                                                                                       }\r
+                                                                                                                                                       break;\r
+\r
+                                                                                                                                               default:\r
+                                                                                                                                                       break;\r
+                                                                                                                                               }\r
+                                                                                                                                       }\r
+                                                                                                                               }\r
+\r
+                                                                                                                               dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);\r
+                                                                                                                       }\r
+\r
+                                                                                                                       PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables++;\r
+\r
+                                                                                                                       dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
+                                                                                                               }\r
+                                                                                                               break;\r
+\r
+                                                                                                       case DW_TAG_label:\r
+                                                                                                               break;\r
+\r
+                                                                                                       default:\r
+                                                                                                               break;\r
+                                                                                                       }\r
+                                                                                               }\r
+                                                                                       }\r
+                                                                                       while (dwarf_siblingof(dbg, return_sub, &return_subdie, &error) == DW_DLV_OK);\r
+                                                                               }\r
+\r
+                                                                               PtrCU[NbCU].NbSubProgs++;\r
+                                                                       }\r
+                                                                       break;\r
+\r
+                                                               default:\r
+                                                                       break;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                               while (dwarf_siblingof(dbg, return_sib, &return_die, &error) == DW_DLV_OK);\r
+                                       }\r
+\r
+                                       // Release the memory used by the source lines\r
+                                       for (i = 0; i < (size_t)cnt; ++i)\r
+                                               dwarf_dealloc(dbg, linebuf[i], DW_DLA_LINE);\r
+                                       dwarf_dealloc(dbg, linebuf, DW_DLA_LIST);\r
+                               }\r
+\r
+                               // Set the source code lines for QT html/text conformity\r
+                               if (PtrCU[NbCU].NbLinesLoadSrc)\r
+                               {\r
+                                       if (PtrCU[NbCU].PtrLinesLoadSrc = (char **)calloc(PtrCU[NbCU].NbLinesLoadSrc, sizeof(char *)))\r
+                                       {\r
+                                               for (j = 0; j < PtrCU[NbCU].NbLinesLoadSrc; j++)\r
+                                               {\r
+                                                       if (PtrCU[NbCU].PtrLinesLoadSrc[j] = (char *)calloc(10000, sizeof(char)))\r
+                                                       {\r
+                                                               if (Ptr = DWARFManager_GetLineSrcFromNumLine(PtrCU[NbCU].PtrLoadSrc, (j + 1)))\r
+                                                               {\r
+                                                                       i = 0;\r
+\r
+                                                                       while (*Ptr)\r
+                                                                       {\r
+                                                                               switch (*Ptr)\r
+                                                                               {\r
+                                                                               case 9:\r
+                                                                                       strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "&nbsp;");\r
+                                                                                       i += strlen("&nbsp;");\r
+                                                                                       break;\r
+\r
+                                                                               case '<':\r
+                                                                                       strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "&lt;");\r
+                                                                                       i += strlen("&lt;");\r
+                                                                                       break;\r
+\r
+                                                                               case '>':\r
+                                                                                       strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "&gt;");\r
+                                                                                       i += strlen("&gt;");\r
+                                                                                       break;\r
+#if 0\r
+                                                                               case '&':\r
+                                                                                       strcpy(PtrCU[NbCU].PtrLinesLoadSrc[j], "&amp;");\r
+                                                                                       i += strlen("&amp;");\r
+                                                                                       break;\r
+#endif\r
+#if 0\r
+                                                                               case '"':\r
+                                                                                       strcpy(PtrCU[NbCU].PtrLinesLoadSrc[j], "&quot;");\r
+                                                                                       i += strlen("&quot;");\r
+                                                                                       break;\r
+#endif\r
+                                                                               default:\r
+                                                                                       PtrCU[NbCU].PtrLinesLoadSrc[j][i++] = *Ptr;\r
+                                                                                       break;\r
+                                                                               }\r
+                                                                               Ptr++;\r
+                                                                       }\r
+                                                               }\r
+                                                               PtrCU[NbCU].PtrLinesLoadSrc[j] = (char *)realloc(PtrCU[NbCU].PtrLinesLoadSrc[j], i + 1);\r
+                                                       }\r
+                                               }\r
+\r
+                                               // Init lines source information based on each source code line numbers\r
+                                               for (j = 0; j < PtrCU[NbCU].NbSubProgs; j++)\r
+                                               {\r
+                                                       // Check if the subprog / function's line exists in the source code\r
+                                                       if (PtrCU[NbCU].PtrSubProgs[j].NumLineSrc <= PtrCU[NbCU].NbLinesLoadSrc)\r
+                                                       {\r
+                                                               PtrCU[NbCU].PtrSubProgs[j].PtrLineSrc = PtrCU[NbCU].PtrLinesLoadSrc[PtrCU[NbCU].PtrSubProgs[j].NumLineSrc - 1];\r
+                                                       }\r
+\r
+                                                       for (k = 0; k < PtrCU[NbCU].PtrSubProgs[j].NbLinesSrc; k++)\r
+                                                       {\r
+                                                               if (PtrCU[NbCU].PtrSubProgs[j].PtrLinesSrc[k].NumLineSrc <= PtrCU[NbCU].NbLinesLoadSrc)\r
+                                                               {\r
+                                                                       PtrCU[NbCU].PtrSubProgs[j].PtrLinesSrc[k].PtrLineSrc = PtrCU[NbCU].PtrLinesLoadSrc[PtrCU[NbCU].PtrSubProgs[j].PtrLinesSrc[k].NumLineSrc - 1];\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       // Set each source lines pointer to NULL\r
+                                       if (PtrCU[NbCU].NbSubProgs)\r
+                                       {\r
+                                               // Check the presence of source lines dedicated to the sub progs\r
+                                               if (PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].NbLinesSrc)\r
+                                               {\r
+                                                       i = PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].NbLinesSrc - 1].NumLineSrc;\r
+                                                       if (PtrCU[NbCU].PtrLinesLoadSrc = (char **)calloc(i, sizeof(char *)))\r
+                                                       {\r
+                                                               for (j = 0; j < i; j++)\r
+                                                               {\r
+                                                                       PtrCU[NbCU].PtrLinesLoadSrc[j] = NULL;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               // Init global variables information based on types information\r
+                               for (i = 0; i < PtrCU[NbCU].NbVariables; i++)\r
+                               {\r
+                                       DWARFManager_InitInfosVariable(PtrCU[NbCU].PtrVariables + i);\r
+                               }\r
+\r
+                               // Init local variables information based on types information\r
+                               for (i = 0; i < PtrCU[NbCU].NbSubProgs; i++)\r
+                               {\r
+                                       for (j = 0; j < PtrCU[NbCU].PtrSubProgs[i].NbVariables; j++)\r
+                                       {\r
+                                               DWARFManager_InitInfosVariable(PtrCU[NbCU].PtrSubProgs[i].PtrVariables + j);\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       ++NbCU;\r
+               }\r
+       } \r
+\r
+       free(SourceFilename);\r
+       free(SourceFileDirectory);\r
+       free(SourceFullFilename);\r
+}\r
+\r
+\r
+// \r
+void DWARFManager_InitInfosVariable(VariablesStruct *PtrVariables)\r
+{\r
+       size_t j, TypeOffset;\r
+\r
+       PtrVariables->PtrTypeName = (char *)calloc(1000, 1);\r
+       TypeOffset = PtrVariables->TypeOffset;\r
+\r
+       for (j = 0; j < PtrCU[NbCU].NbTypes; j++)\r
+       {\r
+               if (TypeOffset == PtrCU[NbCU].PtrTypes[j].Offset)\r
+               {\r
+                       switch (PtrCU[NbCU].PtrTypes[j].Tag)\r
+                       {\r
+                       case DW_TAG_structure_type:\r
+                               PtrVariables->TypeTag |= 0x1;\r
+                               if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
+                               {\r
+                                       j = -1;\r
+                               }\r
+                               else\r
+                               {\r
+                                       if ((PtrVariables->TypeTag & 0x2))\r
+                                       {\r
+                                               strcat(PtrVariables->PtrTypeName, " *");\r
+                                       }\r
+                               }\r
+                               break;\r
+\r
+                       case DW_TAG_pointer_type:\r
+                               PtrVariables->TypeTag |= 0x2;\r
+                               PtrVariables->TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize;\r
+                               PtrVariables->TypeEncoding = 0x10;\r
+                               if (!(TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
+                               {\r
+                                       strcat(PtrVariables->PtrTypeName, "void *");\r
+                               }\r
+                               else\r
+                               {\r
+                                       j = -1;\r
+                               }\r
+                               break;\r
+\r
+                       case DW_TAG_typedef:\r
+                               if (!(PtrVariables->TypeTag & 0x20))\r
+                               {\r
+                                       PtrVariables->TypeTag |= 0x20;\r
+                                       strcat(PtrVariables->PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName);\r
+                               }\r
+                               if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
+                               {\r
+                                       j = -1;\r
+                               }\r
+                               break;\r
+\r
+                       case DW_TAG_subrange_type:\r
+                               PtrVariables->TypeTag |= 0x4;\r
+                               break;\r
+\r
+                       case DW_TAG_array_type:\r
+                               PtrVariables->TypeTag |= 0x8;\r
+                               if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
+                               {\r
+                                       j = -1;\r
+                               }\r
+                               break;\r
+\r
+                       case DW_TAG_const_type:\r
+                               PtrVariables->TypeTag |= 0x10;\r
+                               strcat(PtrVariables->PtrTypeName, "const ");\r
+                               if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
+                               {\r
+                                       j = -1;\r
+                               }\r
+                               break;\r
+\r
+                       case DW_TAG_base_type:\r
+                               if (!(PtrVariables->TypeTag & 0x20))\r
+                               {\r
+                                       strcat(PtrVariables->PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName);\r
+                               }\r
+                               if ((PtrVariables->TypeTag & 0x2))\r
+                               {\r
+                                       strcat(PtrVariables->PtrTypeName, " *");\r
+                               }\r
+                               else\r
+                               {\r
+                                       PtrVariables->TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize;\r
+                                       PtrVariables->TypeEncoding = PtrCU[NbCU].PtrTypes[j].Encoding;\r
+                               }\r
+                               if ((PtrVariables->TypeTag & 0x8))\r
+                               {\r
+                                       strcat(PtrVariables->PtrTypeName, "[]");\r
+                               }\r
+                               break;\r
+\r
+                       default:\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+}\r
+\r
+\r
+// Get symbol name based from address\r
+// Return NULL if no symbol name exists\r
+char *DWARFManager_GetSymbolnameFromAdr(size_t Adr)\r
+{\r
+       size_t i, j;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; (j < PtrCU[i].NbSubProgs); j++)\r
+                       {\r
+                               if ((PtrCU[i].PtrSubProgs[j].StartPC == Adr))\r
+                               {\r
+                                       return PtrCU[i].PtrSubProgs[j].PtrSubprogramName;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return NULL;\r
+}\r
+\r
+\r
+// Get complete source filename based from address\r
+// Return NULL if no source filename exists\r
+// Return the existence status (true or false) in Error\r
+char *DWARFManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error)\r
+{\r
+       size_t i;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       *Error = PtrCU[i].PtrLoadSrc ? true : false;\r
+                       return PtrCU[i].PtrFullFilename;\r
+               }\r
+       }\r
+\r
+       return  NULL;\r
+}\r
+\r
+\r
+// Get text line source based on line number (starting by 1)\r
+// Return NULL if no text line exists or if line number is 0\r
+char *DWARFManager_GetLineSrcFromNumLine(char *PtrSrcFile, size_t NumLine)\r
+{\r
+       size_t i = 0;\r
+       char *PtrLineSrc = NULL;\r
+\r
+       if (PtrSrcFile)\r
+       {\r
+               while (i != NumLine)\r
+               {\r
+                       PtrLineSrc = PtrSrcFile;\r
+                       while (*PtrSrcFile++);\r
+                       i++;\r
+               }\r
+       }\r
+\r
+       return PtrLineSrc;\r
+}\r
+\r
+\r
+// Get number of variables referenced by the function range address\r
+size_t DWARFManager_GetNbLocalVariables(size_t Adr)\r
+{\r
+       size_t i, j;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       return PtrCU[i].PtrSubProgs[j].NbVariables;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+// Get local variable name based on his index (starting by 1)\r
+// Return name's pointer text found\r
+// Return NULL if not found\r
+char *DWARFManager_GetLocalVariableName(size_t Adr, size_t Index)\r
+{\r
+       size_t i, j;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].PtrName;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return NULL;\r
+}\r
+\r
+\r
+// Get local variable's type tag based on his index (starting by 1)\r
+// Return 0 if not found\r
+size_t DWARFManager_GetLocalVariableTypeTag(size_t Adr, size_t Index)\r
+{\r
+       size_t i, j;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].TypeTag;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+//\r
+int DWARFManager_GetLocalVariableOffset(size_t Adr, size_t Index)\r
+{\r
+       size_t i, j;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].Offset;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+// Get local variable Type Byte Size based on his address and index (starting by 1)\r
+// Return 0 if not found\r
+// May return 0 if there is no Type Byte Size linked to the variable's address and index\r
+size_t DWARFManager_GetLocalVariableTypeByteSize(size_t Adr, size_t Index)\r
+{\r
+       size_t i, j;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].TypeByteSize;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+// Get local variable Type Encoding based on his address and index (starting by 1)\r
+// Return 0 if not found\r
+// May return 0 if there is no Type Encoding linked to the variable's address and index\r
+size_t DWARFManager_GetLocalVariableTypeEncoding(size_t Adr, size_t Index)\r
+{\r
+       size_t i, j;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].TypeEncoding;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+// Get local variable Op based on his address and index (starting by 1)\r
+// Return 0 if not found\r
+// May return 0 if there isn't Op linked to the variable's index\r
+size_t DWARFManager_GetLocalVariableOp(size_t Adr, size_t Index)\r
+{\r
+       size_t i, j;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].Op;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+// Get local variable type name based on his index (starting by 1)\r
+// Return NULL if not found\r
+// May return NULL if there is not type linked to the variable's index\r
+char *DWARFManager_GetLocalVariableTypeName(size_t Adr, size_t Index)\r
+{\r
+       size_t i, j;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].PtrTypeName;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return NULL;\r
+}\r
+\r
+\r
+// Get Compilation Unit / global variables numbers\r
+// Return variables number\r
+size_t DWARFManager_GetNbGlobalVariables(void)\r
+{\r
+       size_t NbVariables = 0, i;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               NbVariables += PtrCU[i].NbVariables;\r
+       }\r
+\r
+       return NbVariables;\r
+}\r
+\r
+\r
+// Get global variable type name based on his index (starting by 1)\r
+// Return NULL if not found\r
+// May return NULL if there is not type linked to the variable's index\r
+char *DWARFManager_GetGlobalVariableTypeName(size_t Index)\r
+{\r
+       size_t i;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if (PtrCU[i].NbVariables)\r
+               {\r
+                       if (Index <= PtrCU[i].NbVariables)\r
+                       {\r
+                               return PtrCU[i].PtrVariables[Index - 1].PtrTypeName;\r
+                       }\r
+                       else\r
+                       {\r
+                               Index -= PtrCU[i].NbVariables;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return NULL;\r
+}\r
+\r
+\r
+// Get global variable's type tag based on his index (starting by 1)\r
+// Return 0 if not found\r
+size_t DWARFManager_GetGlobalVariableTypeTag(size_t Index)\r
+{\r
+       size_t i;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if (PtrCU[i].NbVariables)\r
+               {\r
+                       if (Index <= PtrCU[i].NbVariables)\r
+                       {\r
+                               return PtrCU[i].PtrVariables[Index - 1].TypeTag;\r
+                       }\r
+                       else\r
+                       {\r
+                               Index -= PtrCU[i].NbVariables;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+// Get global variable byte size based on his index (starting by 1)\r
+// Return 0 if not found\r
+size_t DWARFManager_GetGlobalVariableTypeByteSize(size_t Index)\r
+{\r
+       size_t i;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if (PtrCU[i].NbVariables)\r
+               {\r
+                       if (Index <= PtrCU[i].NbVariables)\r
+                       {\r
+                               return PtrCU[i].PtrVariables[Index - 1].TypeByteSize;\r
+                       }\r
+                       else\r
+                       {\r
+                               Index -= PtrCU[i].NbVariables;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+// Get global variable encoding based on his index (starting by 1)\r
+// Return 0 if not found\r
+size_t DWARFManager_GetGlobalVariableTypeEncoding(size_t Index)\r
+{\r
+       size_t i;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if (PtrCU[i].NbVariables)\r
+               {\r
+                       if (Index <= PtrCU[i].NbVariables)\r
+                       {\r
+                               return PtrCU[i].PtrVariables[Index - 1].TypeEncoding;\r
+                       }\r
+                       else\r
+                       {\r
+                               Index -= PtrCU[i].NbVariables;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+// Get global variable address based on his index (starting by 1)\r
+// Return 0 if not found\r
+size_t DWARFManager_GetGlobalVariableAdr(size_t Index)\r
+{\r
+       size_t i;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if (PtrCU[i].NbVariables)\r
+               {\r
+                       if (Index <= PtrCU[i].NbVariables)\r
+                       {\r
+                               return PtrCU[i].PtrVariables[Index - 1].Addr;\r
+                       }\r
+                       else\r
+                       {\r
+                               Index -= PtrCU[i].NbVariables;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+// Get global variable memory address based on his name\r
+// Return 0 if not found\r
+// Note: Return the first occurence found\r
+size_t DWARFManager_GetGlobalVariableAdrFromName(char *VariableName)\r
+{\r
+       size_t i, j;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if (PtrCU[i].NbVariables)\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbVariables; j++)\r
+                       {\r
+                               if (!strcmp(PtrCU[i].PtrVariables[j].PtrName,VariableName))\r
+                               {\r
+                                       return PtrCU[i].PtrVariables[j].Addr;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+// Get global variable name based on his index (starting by 1)\r
+// Return name's pointer text found\r
+// Return NULL if not found\r
+char *DWARFManager_GetGlobalVariableName(size_t Index)\r
+{\r
+       size_t i;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if (PtrCU[i].NbVariables)\r
+               {\r
+                       if (Index <= PtrCU[i].NbVariables)\r
+                       {\r
+                               return PtrCU[i].PtrVariables[Index - 1].PtrName;\r
+                       }\r
+                       else\r
+                       {\r
+                               Index -= PtrCU[i].NbVariables;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return NULL;\r
+}\r
+\r
+\r
+// Get text line from source based on address and his tag\r
+// Return NULL if no text line has been found\r
+char *DWARFManager_GetLineSrcFromAdr(size_t Adr, size_t Tag)\r
+{\r
+       size_t i, j, k;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       if ((PtrCU[i].PtrSubProgs[j].StartPC == Adr) && (!Tag || (Tag == DW_TAG_subprogram)))\r
+                                       {\r
+                                               return PtrCU[i].PtrSubProgs[j].PtrLineSrc;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               for (k = 0; k < PtrCU[i].PtrSubProgs[j].NbLinesSrc; k++)\r
+                                               {\r
+                                                       if ((PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].StartPC == Adr) && (!Tag || (PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].Tag == Tag)))\r
+                                                       {\r
+                                                               return PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].PtrLineSrc;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return  NULL;\r
+}\r
+\r
+\r
+// Get line number based on the address and the tag\r
+// Return 0 if no line number has been found\r
+size_t DWARFManager_GetNumLineFromAdr(size_t Adr, size_t Tag)\r
+{\r
+       size_t i, j, k;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; (j < PtrCU[i].NbSubProgs); j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       if ((PtrCU[i].PtrSubProgs[j].StartPC == Adr) && (!Tag || (Tag == DW_TAG_subprogram)))\r
+                                       {\r
+                                               return PtrCU[i].PtrSubProgs[j].NumLineSrc;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               for (k = 0; (k < PtrCU[i].PtrSubProgs[j].NbLinesSrc); k++)\r
+                                               {\r
+                                                       if ((PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].StartPC == Adr) && (!Tag || (PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].Tag == Tag)))\r
+                                                       {\r
+                                                               return PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].NumLineSrc;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+#if 0\r
+                                       if (!Tag || (Tag == DW_TAG_subprogram))\r
+                                       {\r
+                                               return PtrCU[i].PtrSubProgs[j].NumLineSrc;\r
+                                       }\r
+#endif\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return  0;\r
+}\r
+\r
+\r
+// Get function name based on address and his range\r
+// Return NULL if no function name has been found\r
+char *DWARFManager_GetFunctionName(size_t Adr)\r
+{\r
+       size_t i, j;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       return PtrCU[i].PtrSubProgs[j].PtrSubprogramName;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return NULL;\r
+}\r
+\r
+\r
+// Get text line from source based on address and num line (starting by 1)\r
+// Return NULL if no text line has been found\r
+char *DWARFManager_GetLineSrcFromAdrNumLine(size_t Adr, size_t NumLine)\r
+{\r
+       size_t i, j, k;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       if (PtrCU[i].PtrSubProgs[j].NumLineSrc == NumLine)\r
+                                       {\r
+                                               return PtrCU[i].PtrSubProgs[j].PtrLineSrc;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               for (k = 0; k < PtrCU[i].PtrSubProgs[j].NbLinesSrc; k++)\r
+                                               {\r
+                                                       if (PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].NumLineSrc == NumLine)\r
+                                                       {\r
+                                                               return PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].PtrLineSrc;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return NULL;\r
+}\r
+\r
+\r
+// Get text line from source based on address and num line (starting by 1)\r
+// Return NULL if no text line has been found\r
+char *DWARFManager_GetLineSrcFromNumLineBaseAdr(size_t Adr, size_t NumLine)\r
+{\r
+       size_t i;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       if (NumLine <= PtrCU[i].NbLinesLoadSrc)\r
+                       {\r
+                               return PtrCU[i].PtrLinesLoadSrc[NumLine - 1];\r
+                       }\r
+                       else\r
+                       {\r
+                               return NULL;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return NULL;\r
+}\r
+\r