Browse Source

add files

master
Ian Ilkyun Oh 7 months ago
parent
commit
f0678e01b0
  1. 87
      TestLibDlg/IncSourceTestDlg/DlgProxy.cpp
  2. 43
      TestLibDlg/IncSourceTestDlg/DlgProxy.h
  3. 153
      TestLibDlg/IncSourceTestDlg/IncSourceTestDlg.cpp
  4. 33
      TestLibDlg/IncSourceTestDlg/IncSourceTestDlg.h
  5. 29
      TestLibDlg/IncSourceTestDlg/IncSourceTestDlg.idl
  6. BIN
      TestLibDlg/IncSourceTestDlg/IncSourceTestDlg.rc
  7. 17
      TestLibDlg/IncSourceTestDlg/IncSourceTestDlg.reg
  8. 286
      TestLibDlg/IncSourceTestDlg/IncSourceTestDlg.vcxproj
  9. 228
      TestLibDlg/IncSourceTestDlg/IncSourceTestDlg.vcxproj.filters
  10. 6
      TestLibDlg/IncSourceTestDlg/IncSourceTestDlg.vcxproj.user
  11. 590
      TestLibDlg/IncSourceTestDlg/IncSourceTestDlgDlg.cpp
  12. 64
      TestLibDlg/IncSourceTestDlg/IncSourceTestDlgDlg.h
  13. 60
      TestLibDlg/IncSourceTestDlg/framework.h
  14. 253
      TestLibDlg/IncSourceTestDlg/include/a2l/a2lenums.h
  15. 69
      TestLibDlg/IncSourceTestDlg/include/a2l/a2lfile.h
  16. 147
      TestLibDlg/IncSourceTestDlg/include/a2l/a2lobject.h
  17. 34
      TestLibDlg/IncSourceTestDlg/include/a2l/a2lproject.h
  18. 257
      TestLibDlg/IncSourceTestDlg/include/a2l/a2lstructs.h
  19. 28
      TestLibDlg/IncSourceTestDlg/include/a2l/a2mlblock.h
  20. 90
      TestLibDlg/IncSourceTestDlg/include/a2l/a2mlobject.h
  21. 92
      TestLibDlg/IncSourceTestDlg/include/a2l/axispts.h
  22. 32
      TestLibDlg/IncSourceTestDlg/include/a2l/blob.h
  23. 105
      TestLibDlg/IncSourceTestDlg/include/a2l/characteristic.h
  24. 64
      TestLibDlg/IncSourceTestDlg/include/a2l/compumethod.h
  25. 46
      TestLibDlg/IncSourceTestDlg/include/a2l/compuvtab.h
  26. 47
      TestLibDlg/IncSourceTestDlg/include/a2l/compuvtabrange.h
  27. 40
      TestLibDlg/IncSourceTestDlg/include/a2l/frame.h
  28. 88
      TestLibDlg/IncSourceTestDlg/include/a2l/function.h
  29. 50
      TestLibDlg/IncSourceTestDlg/include/a2l/group.h
  30. 40
      TestLibDlg/IncSourceTestDlg/include/a2l/ifdatablock.h
  31. 20
      TestLibDlg/IncSourceTestDlg/include/a2l/ifdataitem.h
  32. 49
      TestLibDlg/IncSourceTestDlg/include/a2l/instance.h
  33. 92
      TestLibDlg/IncSourceTestDlg/include/a2l/measurement.h
  34. 258
      TestLibDlg/IncSourceTestDlg/include/a2l/module.h
  35. 53
      TestLibDlg/IncSourceTestDlg/include/a2l/overwrite.h
  36. 269
      TestLibDlg/IncSourceTestDlg/include/a2l/recordlayout.h
  37. 51
      TestLibDlg/IncSourceTestDlg/include/a2l/structure.h
  38. 70
      TestLibDlg/IncSourceTestDlg/include/a2l/transformer.h
  39. 48
      TestLibDlg/IncSourceTestDlg/include/a2l/unit.h
  40. 5
      TestLibDlg/IncSourceTestDlg/pch.cpp
  41. 13
      TestLibDlg/IncSourceTestDlg/pch.h
  42. BIN
      TestLibDlg/IncSourceTestDlg/res/IncSourceTestDlg.ico
  43. BIN
      TestLibDlg/IncSourceTestDlg/res/IncSourceTestDlg.rc2
  44. 23
      TestLibDlg/IncSourceTestDlg/resource.h
  45. 220
      TestLibDlg/IncSourceTestDlg/src/FlexLexer.h
  46. 496
      TestLibDlg/IncSourceTestDlg/src/a2lenums.cpp
  47. 67
      TestLibDlg/IncSourceTestDlg/src/a2lfile.cpp
  48. 4119
      TestLibDlg/IncSourceTestDlg/src/a2lflexer.cpp
  49. 400
      TestLibDlg/IncSourceTestDlg/src/a2lflexer.l
  50. 706
      TestLibDlg/IncSourceTestDlg/src/a2lhelper.cpp
  51. 55
      TestLibDlg/IncSourceTestDlg/src/a2lhelper.h
  52. 32
      TestLibDlg/IncSourceTestDlg/src/a2lobject.cpp
  53. 7918
      TestLibDlg/IncSourceTestDlg/src/a2lparser.cpp
  54. 6331
      TestLibDlg/IncSourceTestDlg/src/a2lparser.hpp
  55. 1671
      TestLibDlg/IncSourceTestDlg/src/a2lparser.y
  56. 14
      TestLibDlg/IncSourceTestDlg/src/a2lproject.cpp
  57. 523
      TestLibDlg/IncSourceTestDlg/src/a2lscanner.cpp
  58. 231
      TestLibDlg/IncSourceTestDlg/src/a2lscanner.h
  59. 30
      TestLibDlg/IncSourceTestDlg/src/a2mlblock.cpp
  60. 2311
      TestLibDlg/IncSourceTestDlg/src/a2mlflexer.cpp
  61. 162
      TestLibDlg/IncSourceTestDlg/src/a2mlflexer.l
  62. 102
      TestLibDlg/IncSourceTestDlg/src/a2mlobject.cpp
  63. 1905
      TestLibDlg/IncSourceTestDlg/src/a2mlparser.cpp
  64. 1875
      TestLibDlg/IncSourceTestDlg/src/a2mlparser.hpp
  65. 326
      TestLibDlg/IncSourceTestDlg/src/a2mlparser.y
  66. 16
      TestLibDlg/IncSourceTestDlg/src/a2mlscanner.cpp
  67. 50
      TestLibDlg/IncSourceTestDlg/src/a2mlscanner.h
  68. 10
      TestLibDlg/IncSourceTestDlg/src/axisdescr.cpp
  69. 8
      TestLibDlg/IncSourceTestDlg/src/axispts.cpp
  70. 10
      TestLibDlg/IncSourceTestDlg/src/blob.cpp
  71. 12
      TestLibDlg/IncSourceTestDlg/src/characteristic.cpp
  72. 10
      TestLibDlg/IncSourceTestDlg/src/compumethod.cpp
  73. 28
      TestLibDlg/IncSourceTestDlg/src/computab.cpp
  74. 10
      TestLibDlg/IncSourceTestDlg/src/compuvtab.cpp
  75. 10
      TestLibDlg/IncSourceTestDlg/src/compuvtabrange.cpp
  76. 10
      TestLibDlg/IncSourceTestDlg/src/frame.cpp
  77. 3
      TestLibDlg/IncSourceTestDlg/src/function.cpp
  78. 10
      TestLibDlg/IncSourceTestDlg/src/group.cpp
  79. 69
      TestLibDlg/IncSourceTestDlg/src/ifdatablock.cpp
  80. 2158
      TestLibDlg/IncSourceTestDlg/src/ifdataflexer.cpp
  81. 149
      TestLibDlg/IncSourceTestDlg/src/ifdataflexer.l
  82. 1309
      TestLibDlg/IncSourceTestDlg/src/ifdataparser.cpp
  83. 1406
      TestLibDlg/IncSourceTestDlg/src/ifdataparser.hpp
  84. 121
      TestLibDlg/IncSourceTestDlg/src/ifdataparser.y
  85. 16
      TestLibDlg/IncSourceTestDlg/src/ifdatascanner.cpp
  86. 55
      TestLibDlg/IncSourceTestDlg/src/ifdatascanner.h
  87. 12
      TestLibDlg/IncSourceTestDlg/src/instance.cpp
  88. 13
      TestLibDlg/IncSourceTestDlg/src/measurement.cpp
  89. 159
      TestLibDlg/IncSourceTestDlg/src/module.cpp
  90. 10
      TestLibDlg/IncSourceTestDlg/src/overwrite.cpp
  91. 14
      TestLibDlg/IncSourceTestDlg/src/recordlayout.cpp
  92. 10
      TestLibDlg/IncSourceTestDlg/src/structure.cpp
  93. 4
      TestLibDlg/IncSourceTestDlg/src/transformer.cpp
  94. 10
      TestLibDlg/IncSourceTestDlg/src/unit.cpp
  95. 8
      TestLibDlg/IncSourceTestDlg/targetver.h

87
TestLibDlg/IncSourceTestDlg/DlgProxy.cpp

@ -0,0 +1,87 @@

// DlgProxy.cpp: 구현 파일
//
#include "pch.h"
#include "framework.h"
#include "IncSourceTestDlg.h"
#include "DlgProxy.h"
#include "IncSourceTestDlgDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CIncSourceTestDlgDlgAutoProxy
IMPLEMENT_DYNCREATE(CIncSourceTestDlgDlgAutoProxy, CCmdTarget)
CIncSourceTestDlgDlgAutoProxy::CIncSourceTestDlgDlgAutoProxy()
{
EnableAutomation();
// 자동화 개체가 활성화되어 있는 동안 계속 애플리케이션을 실행하기 위해
// 생성자에서 AfxOleLockApp를 호출합니다.
AfxOleLockApp();
// 애플리케이션의 주 창 포인터를 통해 대화 상자에 대한
// 액세스를 가져옵니다. 프록시의 내부 포인터를 설정하여
// 대화 상자를 가리키고 대화 상자의 후방 포인터를 이 프록시로
// 설정합니다.
ASSERT_VALID(AfxGetApp()->m_pMainWnd);
if (AfxGetApp()->m_pMainWnd)
{
ASSERT_KINDOF(CIncSourceTestDlgDlg, AfxGetApp()->m_pMainWnd);
if (AfxGetApp()->m_pMainWnd->IsKindOf(RUNTIME_CLASS(CIncSourceTestDlgDlg)))
{
m_pDialog = reinterpret_cast<CIncSourceTestDlgDlg*>(AfxGetApp()->m_pMainWnd);
m_pDialog->m_pAutoProxy = this;
}
}
}
CIncSourceTestDlgDlgAutoProxy::~CIncSourceTestDlgDlgAutoProxy()
{
// 모든 개체가 OLE 자동화로 만들어졌을 때 애플리케이션을 종료하기 위해
// 소멸자가 AfxOleUnlockApp를 호출합니다.
// 이러한 호출로 주 대화 상자가 삭제될 수 있습니다.
if (m_pDialog != nullptr)
m_pDialog->m_pAutoProxy = nullptr;
AfxOleUnlockApp();
}
void CIncSourceTestDlgDlgAutoProxy::OnFinalRelease()
{
// 자동화 개체에 대한 마지막 참조가 해제되면
// OnFinalRelease가 호출됩니다. 기본 클래스에서 자동으로 개체를 삭제합니다.
// 기본 클래스를 호출하기 전에 개체에 필요한 추가 정리 작업을
// 추가하세요.
CCmdTarget::OnFinalRelease();
}
BEGIN_MESSAGE_MAP(CIncSourceTestDlgDlgAutoProxy, CCmdTarget)
END_MESSAGE_MAP()
BEGIN_DISPATCH_MAP(CIncSourceTestDlgDlgAutoProxy, CCmdTarget)
END_DISPATCH_MAP()
// 참고: IID_IIncSourceTestDlg에 대한 지원을 추가하여
// VBA에서 형식 안전 바인딩을 지원합니다.
// 이 IID는 .IDL 파일에 있는 dispinterface의 GUID와 일치해야 합니다.
// {2ef56b3a-ca68-4764-8fdd-5d19ec609144}
static const IID IID_IIncSourceTestDlg =
{0x2ef56b3a,0xca68,0x4764,{0x8f,0xdd,0x5d,0x19,0xec,0x60,0x91,0x44}};
BEGIN_INTERFACE_MAP(CIncSourceTestDlgDlgAutoProxy, CCmdTarget)
INTERFACE_PART(CIncSourceTestDlgDlgAutoProxy, IID_IIncSourceTestDlg, Dispatch)
END_INTERFACE_MAP()
// IMPLEMENT_OLECREATE2 매크로가 이 프로젝트의 pch.h에 정의됩니다.
// {485ee25e-0171-42b5-8cf0-7883ae87945e}
IMPLEMENT_OLECREATE2(CIncSourceTestDlgDlgAutoProxy, "IncSourceTestDlg.Application", 0x485ee25e,0x0171,0x42b5,0x8c,0xf0,0x78,0x83,0xae,0x87,0x94,0x5e)
// CIncSourceTestDlgDlgAutoProxy 메시지 처리기

43
TestLibDlg/IncSourceTestDlg/DlgProxy.h

@ -0,0 +1,43 @@

// DlgProxy.h: 헤더 파일
//
#pragma once
class CIncSourceTestDlgDlg;
// CIncSourceTestDlgDlgAutoProxy 명령 대상
class CIncSourceTestDlgDlgAutoProxy : public CCmdTarget
{
DECLARE_DYNCREATE(CIncSourceTestDlgDlgAutoProxy)
CIncSourceTestDlgDlgAutoProxy(); // 동적 만들기에 사용되는 protected 생성자입니다.
// 특성입니다.
public:
CIncSourceTestDlgDlg* m_pDialog;
// 작업입니다.
public:
// 재정의입니다.
public:
virtual void OnFinalRelease();
// 구현입니다.
protected:
virtual ~CIncSourceTestDlgDlgAutoProxy();
// 생성된 메시지 맵 함수
DECLARE_MESSAGE_MAP()
DECLARE_OLECREATE(CIncSourceTestDlgDlgAutoProxy)
// 생성된 OLE 디스패치 맵 함수
DECLARE_DISPATCH_MAP()
DECLARE_INTERFACE_MAP()
};

153
TestLibDlg/IncSourceTestDlg/IncSourceTestDlg.cpp

@ -0,0 +1,153 @@

// IncSourceTestDlg.cpp: 애플리케이션에 대한 클래스 동작을 정의합니다.
//
#include "pch.h"
#include "framework.h"
#include "IncSourceTestDlg.h"
#include "IncSourceTestDlgDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CIncSourceTestDlgApp
BEGIN_MESSAGE_MAP(CIncSourceTestDlgApp, CWinApp)
ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()
// CIncSourceTestDlgApp 생성
CIncSourceTestDlgApp::CIncSourceTestDlgApp()
{
// 다시 시작 관리자 지원
m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;
// TODO: 여기에 생성 코드를 추가합니다.
// InitInstance에 모든 중요한 초기화 작업을 배치합니다.
}
// 유일한 CIncSourceTestDlgApp 개체입니다.
CIncSourceTestDlgApp theApp;
const GUID CDECL BASED_CODE _tlid =
{0xfdcaae6b,0x3d5c,0x4612,{0x8b,0xfc,0x6b,0x4e,0x40,0xf2,0x51,0x8d}};
const WORD _wVerMajor = 1;
const WORD _wVerMinor = 0;
// CIncSourceTestDlgApp 초기화
BOOL CIncSourceTestDlgApp::InitInstance()
{
// Windows XP에서는 InitCommonControlsEx()를 필요로 합니다.
// 사용하도록 지정하는 경우, Windows XP 상에서 반드시 InitCommonControlsEx()가 필요합니다.
// InitCommonControlsEx()를 사용하지 않으면 창을 만들 수 없습니다.
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 응용 프로그램에서 사용할 모든 공용 컨트롤 클래스를 포함하도록
// 이 항목을 설정하십시오.
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
// OLE 라이브러리를 초기화합니다.
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
AfxEnableControlContainer();
// 대화 상자에 셸 트리 뷰 또는
// 셸 목록 뷰 컨트롤이 포함되어 있는 경우 셸 관리자를 만듭니다.
CShellManager *pShellManager = new CShellManager;
// MFC 컨트롤의 테마를 사용하기 위해 "Windows 원형" 비주얼 관리자 활성화
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
// 표준 초기화
// 이들 기능을 사용하지 않고 최종 실행 파일의 크기를 줄이려면
// 아래에서 필요 없는 특정 초기화
// 루틴을 제거해야 합니다.
// 해당 설정이 저장된 레지스트리 키를 변경하십시오.
// TODO: 이 문자열을 회사 또는 조직의 이름과 같은
// 적절한 내용으로 수정해야 합니다.
SetRegistryKey(_T("로컬 애플리케이션 마법사에서 생성된 애플리케이션"));
// 자동화 또는 reg/unreg 스위치에 대한 명령줄을 구문 분석합니다.
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// 응용 프로그램이 /Embedding 또는 /Automation 스위치로 시작되었습니다.
// 응용 프로그램을 자동화 서버로 실행합니다.
if (cmdInfo.m_bRunEmbedded || cmdInfo.m_bRunAutomated)
{
// CoRegisterClassObject()를 통해 클래스 팩터리를 등록합니다.
COleTemplateServer::RegisterAll();
}
// 응용 프로그램이 /Unregserver 또는 /Unregister 스위치로 시작되었습니다. 레지스트리에서 항목을
// 제거합니다.
else if (cmdInfo.m_nShellCommand == CCommandLineInfo::AppUnregister)
{
COleObjectFactory::UpdateRegistryAll(FALSE);
AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor);
return FALSE;
}
// 응용 프로그램이 독립 실행형으로 시작되었거나 다른 스위치로 시작되었습니다(예: /Register
// 또는 /Regserver). typelibrary를 포함하여 레지스트리 항목을 업데이트합니다.
else
{
COleObjectFactory::UpdateRegistryAll();
AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid);
if (cmdInfo.m_nShellCommand == CCommandLineInfo::AppRegister)
return FALSE;
}
CIncSourceTestDlgDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 여기에 [확인]을 클릭하여 대화 상자가 없어질 때 처리할
// 코드를 배치합니다.
}
else if (nResponse == IDCANCEL)
{
// TODO: 여기에 [취소]를 클릭하여 대화 상자가 없어질 때 처리할
// 코드를 배치합니다.
}
else if (nResponse == -1)
{
TRACE(traceAppMsg, 0, "경고: 대화 상자를 만들지 못했으므로 애플리케이션이 예기치 않게 종료됩니다.\n");
TRACE(traceAppMsg, 0, "경고: 대화 상자에서 MFC 컨트롤을 사용하는 경우 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS를 수행할 수 없습니다.\n");
}
// 위에서 만든 셸 관리자를 삭제합니다.
if (pShellManager != nullptr)
{
delete pShellManager;
}
#if !defined(_AFXDLL) && !defined(_AFX_NO_MFC_CONTROLS_IN_DIALOGS)
ControlBarCleanUp();
#endif
// 대화 상자가 닫혔으므로 응용 프로그램의 메시지 펌프를 시작하지 않고 응용 프로그램을 끝낼 수 있도록 FALSE를
// 반환합니다.
return FALSE;
}
int CIncSourceTestDlgApp::ExitInstance()
{
AfxOleTerm(FALSE);
return CWinApp::ExitInstance();
}

33
TestLibDlg/IncSourceTestDlg/IncSourceTestDlg.h

@ -0,0 +1,33 @@

// IncSourceTestDlg.h: PROJECT_NAME 애플리케이션에 대한 주 헤더 파일입니다.
//
#pragma once
#ifndef __AFXWIN_H__
#error "PCH에 대해 이 파일을 포함하기 전에 'pch.h'를 포함합니다."
#endif
#include "resource.h" // 주 기호입니다.
// CIncSourceTestDlgApp:
// 이 클래스의 구현에 대해서는 IncSourceTestDlg.cpp을(를) 참조하세요.
//
class CIncSourceTestDlgApp : public CWinApp
{
public:
CIncSourceTestDlgApp();
// 재정의입니다.
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
// 구현입니다.
DECLARE_MESSAGE_MAP()
};
extern CIncSourceTestDlgApp theApp;

29
TestLibDlg/IncSourceTestDlg/IncSourceTestDlg.idl

@ -0,0 +1,29 @@
// IncSourceTestDlg.idl: IncSourceTestDlg.exe의 형식 라이브러리 소스
// 이 파일은 MIDL 컴파일러에 의해 처리되어
// 형식 라이브러리(IncSourceTestDlg.tlb)입니다.
[ uuid(fdcaae6b-3d5c-4612-8bfc-6b4e40f2518d), version(1.0) ]
library IncSourceTestDlg
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
// CIncSourceTestDlgDoc의 기본 디스패치 인터페이스
[ uuid(2ef56b3a-ca68-4764-8fdd-5d19ec609144) ]
dispinterface IIncSourceTestDlg
{
properties:
methods:
};
// CIncSourceTestDlgDoc에 대한 클래스 정보
[ uuid(485ee25e-0171-42b5-8cf0-7883ae87945e) ]
coclass IncSourceTestDlg
{
[default] dispinterface IIncSourceTestDlg;
};
};

BIN
TestLibDlg/IncSourceTestDlg/IncSourceTestDlg.rc

Binary file not shown.

17
TestLibDlg/IncSourceTestDlg/IncSourceTestDlg.reg

@ -0,0 +1,17 @@
REGEDIT
; .REG 파일은 SETUP 프로그램에 사용될 수 있습니다.
; SETUP 프로그램을 사용할 수 없는 경우 아래 항목이
; CWinApp::RegisterShellFileTypes 및 COleObjectFactory::UpdateRegistryAll을
; 호출하여 InitInstance에 자동으로 등록됩니다.
HKEY_CLASSES_ROOT\IncSourceTestDlg.Application = IncSourceTestDlg Application
HKEY_CLASSES_ROOT\IncSourceTestDlg.Application\CLSID = {485ee25e-0171-42b5-8cf0-7883ae87945e}
HKEY_CLASSES_ROOT\CLSID\{485ee25e-0171-42b5-8cf0-7883ae87945e} = IncSourceTestDlg Application
HKEY_CLASSES_ROOT\CLSID\{485ee25e-0171-42b5-8cf0-7883ae87945e}\ProgId = IncSourceTestDlg.Application
HKEY_CLASSES_ROOT\CLSID\{485ee25e-0171-42b5-8cf0-7883ae87945e}\LocalServer32 = IncSourceTestDlg.EXE

286
TestLibDlg/IncSourceTestDlg/IncSourceTestDlg.vcxproj

@ -0,0 +1,286 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<ProjectGuid>{44739900-23B0-7EA4-48FA-099C6C559D77}</ProjectGuid>
<Keyword>MFCProj</Keyword>
<RootNamespace>IncSourceTestDlg</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>C:\git_work\a2l\a2l_test\TestLibDlg\IncSourceTestDlg\include;C:\git_work\a2l\a2l_test\TestLibDlg\IncSourceTestDlg\src;C:\boost\include\boost-1_87;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard>stdcpp20</LanguageStandard>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<RegisterOutput>true</RegisterOutput>
<AdditionalLibraryDirectories>C:\boost\x86_lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<TypeLibraryName>$(IntDir)IncSourceTestDlg.tlb</TypeLibraryName>
<HeaderFileName>IncSourceTestDlg_h.h</HeaderFileName>
</Midl>
<ResourceCompile>
<Culture>0x0412</Culture>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<RegisterOutput>true</RegisterOutput>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<TypeLibraryName>$(IntDir)IncSourceTestDlg.tlb</TypeLibraryName>
<HeaderFileName>IncSourceTestDlg_h.h</HeaderFileName>
</Midl>
<ResourceCompile>
<Culture>0x0412</Culture>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<RegisterOutput>true</RegisterOutput>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<TypeLibraryName>$(IntDir)IncSourceTestDlg.tlb</TypeLibraryName>
<HeaderFileName>IncSourceTestDlg_h.h</HeaderFileName>
</Midl>
<ResourceCompile>
<Culture>0x0412</Culture>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<RegisterOutput>true</RegisterOutput>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<TypeLibraryName>$(IntDir)IncSourceTestDlg.tlb</TypeLibraryName>
<HeaderFileName>IncSourceTestDlg_h.h</HeaderFileName>
</Midl>
<ResourceCompile>
<Culture>0x0412</Culture>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="DlgProxy.h" />
<ClInclude Include="framework.h" />
<ClInclude Include="IncSourceTestDlg.h" />
<ClInclude Include="IncSourceTestDlgDlg.h" />
<ClInclude Include="pch.h" />
<ClInclude Include="Resource.h" />
<ClInclude Include="src\a2lhelper.h" />
<ClInclude Include="src\a2lparser.hpp" />
<ClInclude Include="src\a2lscanner.h" />
<ClInclude Include="src\a2mlparser.hpp" />
<ClInclude Include="src\a2mlscanner.h" />
<ClInclude Include="src\FlexLexer.h" />
<ClInclude Include="src\ifdataparser.hpp" />
<ClInclude Include="src\ifdatascanner.h" />
<ClInclude Include="targetver.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="DlgProxy.cpp" />
<ClCompile Include="IncSourceTestDlg.cpp" />
<ClCompile Include="IncSourceTestDlgDlg.cpp" />
<ClCompile Include="pch.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
</ClCompile>
<ClCompile Include="src\a2lenums.cpp" />
<ClCompile Include="src\a2lfile.cpp" />
<ClCompile Include="src\a2lflexer.cpp" />
<ClCompile Include="src\a2lhelper.cpp" />
<ClCompile Include="src\a2lobject.cpp" />
<ClCompile Include="src\a2lparser.cpp" />
<ClCompile Include="src\a2lproject.cpp" />
<ClCompile Include="src\a2lscanner.cpp" />
<ClCompile Include="src\a2mlblock.cpp" />
<ClCompile Include="src\a2mlflexer.cpp" />
<ClCompile Include="src\a2mlobject.cpp" />
<ClCompile Include="src\a2mlparser.cpp" />
<ClCompile Include="src\a2mlscanner.cpp" />
<ClCompile Include="src\axisdescr.cpp" />
<ClCompile Include="src\axispts.cpp" />
<ClCompile Include="src\blob.cpp" />
<ClCompile Include="src\characteristic.cpp" />
<ClCompile Include="src\compumethod.cpp" />
<ClCompile Include="src\computab.cpp" />
<ClCompile Include="src\compuvtab.cpp" />
<ClCompile Include="src\compuvtabrange.cpp" />
<ClCompile Include="src\frame.cpp" />
<ClCompile Include="src\function.cpp" />
<ClCompile Include="src\group.cpp" />
<ClCompile Include="src\ifdatablock.cpp" />
<ClCompile Include="src\ifdataflexer.cpp" />
<ClCompile Include="src\ifdataparser.cpp" />
<ClCompile Include="src\ifdatascanner.cpp" />
<ClCompile Include="src\instance.cpp" />
<ClCompile Include="src\measurement.cpp" />
<ClCompile Include="src\module.cpp" />
<ClCompile Include="src\overwrite.cpp" />
<ClCompile Include="src\recordlayout.cpp" />
<ClCompile Include="src\structure.cpp" />
<ClCompile Include="src\transformer.cpp" />
<ClCompile Include="src\unit.cpp" />
</ItemGroup>
<ItemGroup>
<Midl Include="IncSourceTestDlg.idl" />
</ItemGroup>
<ItemGroup>
<None Include="IncSourceTestDlg.reg" />
<None Include="res\IncSourceTestDlg.rc2" />
<None Include="src\a2lflexer.l" />
<None Include="src\a2lparser.y" />
<None Include="src\a2mlflexer.l" />
<None Include="src\a2mlparser.y" />
<None Include="src\ifdataflexer.l" />
<None Include="src\ifdataparser.y" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="IncSourceTestDlg.rc" />
</ItemGroup>
<ItemGroup>
<Image Include="res\IncSourceTestDlg.ico" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

228
TestLibDlg/IncSourceTestDlg/IncSourceTestDlg.vcxproj.filters

@ -0,0 +1,228 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="소스 파일">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="헤더 파일">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="리소스 파일">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="src">
<UniqueIdentifier>{ab092bfb-4c1e-40f2-bfa9-349fda25fa4c}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="IncSourceTestDlg.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="IncSourceTestDlgDlg.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="DlgProxy.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="framework.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="targetver.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="Resource.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="pch.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="src\a2lhelper.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="src\a2lparser.hpp">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="src\a2lscanner.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="src\a2mlparser.hpp">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="src\a2mlscanner.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="src\FlexLexer.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="src\ifdataparser.hpp">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="src\ifdatascanner.h">
<Filter>src</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="IncSourceTestDlg.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
<ClCompile Include="IncSourceTestDlgDlg.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
<ClCompile Include="DlgProxy.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
<ClCompile Include="pch.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
<ClCompile Include="src\a2lenums.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\a2lfile.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\a2lflexer.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\a2lhelper.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\a2lobject.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\a2lparser.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\a2lproject.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\a2lscanner.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\a2mlblock.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\a2mlflexer.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\a2mlobject.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\a2mlparser.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\a2mlscanner.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\axisdescr.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\axispts.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\blob.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\characteristic.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\compumethod.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\computab.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\compuvtab.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\compuvtabrange.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\frame.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\function.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\group.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\ifdatablock.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\ifdataflexer.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\ifdataparser.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\ifdatascanner.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\instance.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\measurement.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\module.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\overwrite.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\recordlayout.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\structure.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\transformer.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="src\unit.cpp">
<Filter>src</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Midl Include="IncSourceTestDlg.idl">
<Filter>소스 파일</Filter>
</Midl>
</ItemGroup>
<ItemGroup>
<None Include="IncSourceTestDlg.reg" />
<None Include="res\IncSourceTestDlg.rc2">
<Filter>리소스 파일</Filter>
</None>
<None Include="src\a2lflexer.l">
<Filter>src</Filter>
</None>
<None Include="src\a2lparser.y">
<Filter>src</Filter>
</None>
<None Include="src\a2mlflexer.l">
<Filter>src</Filter>
</None>
<None Include="src\a2mlparser.y">
<Filter>src</Filter>
</None>
<None Include="src\ifdataflexer.l">
<Filter>src</Filter>
</None>
<None Include="src\ifdataparser.y">
<Filter>src</Filter>
</None>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="IncSourceTestDlg.rc">
<Filter>리소스 파일</Filter>
</ResourceCompile>
</ItemGroup>
<ItemGroup>
<Image Include="res\IncSourceTestDlg.ico">
<Filter>리소스 파일</Filter>
</Image>
</ItemGroup>
</Project>

6
TestLibDlg/IncSourceTestDlg/IncSourceTestDlg.vcxproj.user

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<RESOURCE_FILE>IncSourceTestDlg.rc</RESOURCE_FILE>
</PropertyGroup>
</Project>

590
TestLibDlg/IncSourceTestDlg/IncSourceTestDlgDlg.cpp

@ -0,0 +1,590 @@

// IncSourceTestDlgDlg.cpp: 구현 파일
//
#include "pch.h"
#include "framework.h"
#include "IncSourceTestDlg.h"
#include "IncSourceTestDlgDlg.h"
#include "DlgProxy.h"
#include "afxdialogex.h"
#include <iostream>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
//template<typename ... Args>
//std::wstring wstring_format(const std::wstring& format, Args ... args);
template<typename ... Args>
std::string string_format(const std::string& format, Args ... args)
{
size_t size = snprintf(nullptr, 0, format.c_str(), args ...) + 1; // Extra space for '\0'
if (size <= 0) {
throw std::runtime_error("Error during formatting.");
}
std::unique_ptr<char[]> buf(new char[size]);
snprintf(buf.get(), size, format.c_str(), args ...);
return std::string(buf.get(), buf.get() + size - 1); // We don't want the '\0' inside }
}
// 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다.
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 대화 상자 데이터입니다.
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUTBOX };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
// 구현입니다.
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CIncSourceTestDlgDlg 대화 상자
IMPLEMENT_DYNAMIC(CIncSourceTestDlgDlg, CDialogEx);
CIncSourceTestDlgDlg::CIncSourceTestDlgDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_INCSOURCETESTDLG_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_pAutoProxy = nullptr;
}
CIncSourceTestDlgDlg::~CIncSourceTestDlgDlg()
{
// 이 대화 상자에 대한 자동화 프록시가 있을 경우 이 대화 상자에 대한
// 후방 포인터를 null로 설정하여
// 대화 상자가 삭제되었음을 알 수 있게 합니다.
if (m_pAutoProxy != nullptr)
m_pAutoProxy->m_pDialog = nullptr;
}
void CIncSourceTestDlgDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CIncSourceTestDlgDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_CLOSE()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_OPEN, &CIncSourceTestDlgDlg::OnBnClickedButtonOpen)
END_MESSAGE_MAP()
// CIncSourceTestDlgDlg 메시지 처리기
BOOL CIncSourceTestDlgDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.
// IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 이 대화 상자의 아이콘을 설정합니다. 응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
// 프레임워크가 이 작업을 자동으로 수행합니다.
SetIcon(m_hIcon, TRUE); // 큰 아이콘을 설정합니다.
SetIcon(m_hIcon, FALSE); // 작은 아이콘을 설정합니다.
// TODO: 여기에 추가 초기화 작업을 추가합니다.
return TRUE; // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}
void CIncSourceTestDlgDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 대화 상자에 최소화 단추를 추가할 경우 아이콘을 그리려면
// 아래 코드가 필요합니다. 문서/뷰 모델을 사용하는 MFC 애플리케이션의 경우에는
// 프레임워크에서 이 작업을 자동으로 수행합니다.
void CIncSourceTestDlgDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다.
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 아이콘을 그립니다.
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
// 사용자가 최소화된 창을 끄는 동안에 커서가 표시되도록 시스템에서
// 이 함수를 호출합니다.
HCURSOR CIncSourceTestDlgDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
// 컨트롤러에서 해당 개체 중 하나를 계속 사용하고 있을 경우
// 사용자가 UI를 닫을 때 자동화 서버를 종료하면 안 됩니다. 이들
// 메시지 처리기는 프록시가 아직 사용 중인 경우 UI는 숨기지만,
// UI가 표시되지 않아도 대화 상자는
// 남겨 둡니다.
void CIncSourceTestDlgDlg::OnClose()
{
if (CanExit())
CDialogEx::OnClose();
}
void CIncSourceTestDlgDlg::OnOK()
{
if (CanExit())
CDialogEx::OnOK();
}
void CIncSourceTestDlgDlg::OnCancel()
{
if (CanExit())
CDialogEx::OnCancel();
}
BOOL CIncSourceTestDlgDlg::CanExit()
{
// 프록시 개체가 계속 남아 있으면 자동화 컨트롤러에서는
// 이 애플리케이션을 계속 사용합니다. 대화 상자는 남겨 두지만
// 해당 UI는 숨깁니다.
if (m_pAutoProxy != nullptr)
{
ShowWindow(SW_HIDE);
return FALSE;
}
return TRUE;
}
void CIncSourceTestDlgDlg::OnBnClickedButtonOpen()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
TCHAR a2lExt[] = _T("*.a2l");
TCHAR a2lBaseFilter[] = _T("A2L file(*.A2L) | *.a2l;*.A2L | 모든파일(*.*) | *.* ||");
CFileDialog dlg(TRUE, a2lExt, NULL, OFN_HIDEREADONLY, a2lBaseFilter);
if (dlg.DoModal() == IDOK) {
std::wstring strPath = dlg.GetPathName().GetBuffer();
std::string strA2lPath;
strA2lPath.assign(strPath.begin(), strPath.end());
loadA2lFile(strA2lPath.c_str());
}
}
void CIncSourceTestDlgDlg::loadA2lFile(std::string strFilePath)
{
std::string strLogData;
bool bIsFileExist = false;
try {
bIsFileExist = std::filesystem::exists(strFilePath);
}
catch (const std::exception& error) {
std::cout << "Failed to fetch the A2l test files. Error: "
<< error.what();
}
a2l::A2lFile file;
file.Filename(strFilePath.data());
const auto parse = file.ParseFile();
if (parse)
std::cout << file.LastError() << " : " << strFilePath.data();
std::cout << file.Name() << (parse ? " : OK" : " : FAIL") << std::endl;
AddLogString(strFilePath.data());
//if (file.A2lVersion().VersionNo == 1)
// ;
std::cout << file.A2lVersion().VersionNo << " : " << file.A2lVersion().VersionNo;
AddLogString(string_format("file.A2lVersion().VersionNo : %d", file.A2lVersion().VersionNo));
//if (file.A2lVersion().UpgradeNo == 71)
// ;
std::cout << file.A2lVersion().UpgradeNo << " : " << file.A2lVersion().UpgradeNo;
AddLogString(string_format("file.A2lVersion().UpgradeNo : %d", file.A2lVersion().UpgradeNo));
const auto& project = file.Project();
const auto& header = project.Header();
//EXPECT_FALSE(header.Comment.empty());
//EXPECT_FALSE(header.ProjectNo.empty());
//EXPECT_FALSE(header.VersionNo.empty());
std::cout << header.Comment << " : " << header.Comment;
AddLogString(string_format("header.Comment : %s", header.Comment.c_str()));
std::cout << header.ProjectNo << " : " << header.ProjectNo;
AddLogString(string_format("header.ProjectNo : %s", header.ProjectNo.c_str()));
std::cout << header.VersionNo << " : " << header.VersionNo;
AddLogString(string_format("header.VersionNo : %s", header.VersionNo.c_str()));
const auto& module_list = project.Modules();
//ASSERT_EQ(module_list.size(), 1);
std::cout << module_list.size() << " : " << module_list.size();
AddLogString(string_format("module_list.size() : %d", module_list.size()));
if (module_list.size() > 0) {
const auto& module = module_list.cbegin()->second;
//ASSERT_TRUE(module);
//EXPECT_STREQ(module->Name().c_str(), "Example");
//EXPECT_FALSE(module->A2ml().empty());
AddLogString(string_format("module->Name() : %s", module->Name().c_str()));
AddLogString(string_format("module->A2ml() : %s", module->A2ml().c_str()));
AddLogString("");
const auto& modPar = module->ModPar();
AddLogString(string_format("modPar.Comment() : %s", modPar.Comment.c_str()));
AddLogString(string_format("modPar.epk : %s", modPar.Epk.c_str()));
AddLogString(string_format("modPar.addr_epk size : %d", modPar.AddressEpkList.size()));
for (int i = 0; i < modPar.AddressEpkList.size(); i++) {
AddLogString(string_format("modPar.addr_epk (%d) addr (0x%X)", i, modPar.AddressEpkList.at(i)));
}
AddLogString(string_format("modPar.memory layout size : %d", modPar.MemoryLayoutList.size()));
/*
for (int i = 0; i < modPar.MemoryLayoutList.size(); i++) {
AddLogString(string_format("modPar.MemoryLayoutList (%d) addr (0x%X)", i, modPar.MemoryLayoutList.at(i)));
}
*/
AddLogString(string_format("modPar.memory segment size : %d", modPar.MemorySegmentList.size()));
for (int i = 0; i < modPar.MemorySegmentList.size(); i++) {
AddLogString(string_format("(%d) modPar.Memory sement description=[%s] segment_type=[%d] memory_type=[%d] attribution=[%d] addr (0x%X) size(0x%X) offset_list=[%d] ifDataList=[%d]",
i, modPar.MemorySegmentList.at(i).Description.c_str(), modPar.MemorySegmentList.at(i).SegmentType, modPar.MemorySegmentList.at(i).MemoryType,
modPar.MemorySegmentList.at(i).Attribute, modPar.MemorySegmentList.at(i).Address, modPar.MemorySegmentList.at(i).Size,
modPar.MemorySegmentList.at(i).OffsetList.size(), modPar.MemorySegmentList.at(i).IfDataList.size()));
}
AddLogString("");
const auto& modComm = module->ModCommon();
AddLogString(string_format("modComm.Comment() : %s", modComm.Comment.c_str()));
AddLogString(string_format("modComm.Deposit : %d", modComm.Deposit));
AddLogString(string_format("modComm.ByteOrder : %d", modComm.ByteOrder));
AddLogString(string_format("modComm.AlignmentByte : %d", modComm.AlignmentByte));
AddLogString(string_format("modComm.AlignmentFloat16 : %d", modComm.AlignmentFloat16));
AddLogString(string_format("modComm.AlignmentFloat32 : %d", modComm.AlignmentFloat32));
AddLogString(string_format("modComm.AlignmentFloat64 : %d", modComm.AlignmentFloat64));
AddLogString(string_format("modComm.AlignmentInt64 : %d", modComm.AlignmentInt64));
AddLogString(string_format("modComm.AlignmentLong : %d", modComm.AlignmentLong));
AddLogString(string_format("modComm.AlignmentWord : %d", modComm.AlignmentWord));
AddLogString("");
for (const auto& [protocol, if_data] : module->IfDatas()) {
a2l::IfDataBlock block(if_data);
//EXPECT_TRUE(block.IsOk()) << block.LastError();
std::cout << block.AsString() << std::endl;
AddLogString(string_format("IF_DATA : %s", block.Protocol().c_str()));
AddLogString(string_format("block.ItemList().size() : %d", block.ItemList().size()));
for (int i = 0; i < block.ItemList().size(); i++) {
AddLogString(string_format("%d block.ItemList() : %s", i, block.ItemList()[i].BlockName.c_str()));
AddLogString(string_format("block.ItemList()[i].ItemList.size() : %d", block.ItemList()[i].ItemList.size()));
for (int j = 0; j < block.ItemList()[i].ItemList.size(); j++) {
// check digit
bool bIsDigit = true;
if (j > 0)
TRACE("asdf");
for (int cnt = 0; cnt < block.ItemList()[i].ItemList[j].Value.size(); cnt++) {
//int value = std::isdigit(block.ItemList()[i].ItemList[j].Value.at(cnt));
//int alpha = std::isalpha(block.ItemList()[i].ItemList[j].Value.at(cnt));
//TRACE("[%c][%d][%d]\n", block.ItemList()[i].ItemList[j].Value.at(cnt), value, alpha);
if (std::isdigit(block.ItemList()[i].ItemList[j].Value.at(cnt)) == 0)
bIsDigit = false;
}
if (bIsDigit)
AddLogString(string_format("%d : Address 0x%X (%d) : %s itemlist=%d", j, atoi(block.ItemList()[i].ItemList[j].Value.c_str()), atoi(block.ItemList()[i].ItemList[j].Value.c_str()), block.ItemList()[i].ItemList[j].BlockName.c_str(), block.ItemList()[i].ItemList[j].ItemList.size()));
else
AddLogString(string_format("%d : %s : %s itemlist=%d", j, block.ItemList()[i].ItemList[j].Value.c_str(), block.ItemList()[i].ItemList[j].BlockName.c_str(), block.ItemList()[i].ItemList[j].ItemList.size()));
for (int k = 0; k < (block.ItemList()[i].ItemList[j].ItemList.size()); k++) {
AddLogString(string_format(" %d : %s : %s", k, block.ItemList()[i].ItemList[j].ItemList[k].Value.c_str(), block.ItemList()[i].ItemList[j].ItemList[k].BlockName.c_str()));
}
}
AddLogString("");
}
//AddLogString(string_format("block.AsString() : %s", block.AsString().c_str()));
AddLogString("");
}
AddLogString("");
const auto& axis_list = module->AxisPtss();
//EXPECT_GT(axis_list.size(), 1);
std::cout << "\t\tAXIS PTS" << std::endl;
for (const auto& [pts_name, pts] : axis_list) {
std::cout << pts_name << std::endl;
}
std::cout << std::endl;
const auto& blob_list = module->Blobs();
//EXPECT_GT(blob_list.size(), 0);
std::cout << "\t\tBLOB" << std::endl;
for (const auto& [blob_name, blob] : blob_list) {
std::cout << blob_name << " " << blob->Address() << std::endl;
}
std::cout << std::endl;
AddLogString("");
const auto& characteristic_list = module->Characteristics();
//EXPECT_GT(characteristic_list.size(), 0);
std::cout << "\t\tCHARACTERISTIC" << std::endl;
AddLogString(string_format("chracteristics : %d", characteristic_list.size()));
int i = 0;
for (const auto& [char_name, characteristic] : characteristic_list) {
std::cout << char_name << " " << characteristic->Description() << std::endl;
AddLogString(string_format(" %d : %s", i, characteristic->Description().c_str()));
}
std::cout << std::endl;
AddLogString("");
const auto& compu_method_list = module->CompuMethods();
//EXPECT_GT(compu_method_list.size(), 0);
std::cout << "\t\tCOMPU METHOD" << std::endl;
for (const auto& [method_name, method] : compu_method_list) {
std::cout << method_name << " " << method->Description() << std::endl;
}
std::cout << std::endl;
const auto& compu_tab_list = module->CompuTabs();
//EXPECT_GT(compu_tab_list.size(), 0);
std::cout << "\t\tCOMPU TAB" << std::endl;
for (const auto& [tab_name, tab] : compu_tab_list) {
std::cout << tab_name << " " << tab->Description() << std::endl;
}
std::cout << std::endl;
const auto& compu_vtab_list = module->CompuVtabs();
//EXPECT_GT(compu_vtab_list.size(), 0);
std::cout << "\t\tCOMPU VTAB" << std::endl;
for (const auto& [vtab_name, vtab] : compu_vtab_list) {
std::cout << vtab_name << " " << vtab->Description() << std::endl;
}
std::cout << std::endl;
const auto& compu_vtab_range_list = module->CompuVtabRanges();
//EXPECT_GT(compu_vtab_range_list.size(), 0);
std::cout << "\t\tCOMPU VTAB RANGE" << std::endl;
for (const auto& [range_name, range] : compu_vtab_range_list) {
std::cout << range_name << " " << range->Description() << std::endl;
}
std::cout << std::endl;
const auto& frame_list = module->Frames();
// EXPECT_GT(frame_list.size(), 0); No frames in file
std::cout << "\t\tFRAME" << std::endl;
for (const auto& [frame_name, frame] : frame_list) {
std::cout << frame_name << " " << frame->Description() << std::endl;
}
std::cout << std::endl;
const auto& func_list = module->Functions();
//EXPECT_GT(func_list.size(), 0);
std::cout << "\t\tFUNCTION" << std::endl;
for (const auto& [func_name, func] : func_list) {
std::cout << func_name << " " << func->Description() << std::endl;
}
std::cout << std::endl;
const auto& group_list = module->Groups();
//EXPECT_GT(group_list.size(), 0);
std::cout << "\t\tGROUP" << std::endl;
for (const auto& [group_name, group] : group_list) {
std::cout << group_name << " " << group->Description() << std::endl;
}
std::cout << std::endl;
const auto& instance_list = module->Instances();
//EXPECT_GT(instance_list.size(), 0);
std::cout << "\t\tINSTANCE" << std::endl;
for (const auto& [instance_name, instance] : instance_list) {
std::cout << instance_name << " " << instance->Description() << std::endl;
}
std::cout << std::endl;
AddLogString("");
const auto& meas_list = module->Measurements();
//EXPECT_GT(meas_list.size(), 0);
std::cout << "\t\tMEASUREMENT" << std::endl;
AddLogString(string_format("measurement : %d", meas_list.size()));
i = 0;
for (const auto& [meas_name, meas] : meas_list) {
std::cout << meas_name << " " << meas->Description() << std::endl;
AddLogString(string_format(" %d : %s", i, meas->Description().c_str()));
}
std::cout << std::endl;
AddLogString("");
const auto& rec_list = module->RecordLayouts();
//EXPECT_GT(rec_list.size(), 0);
std::cout << "\t\tRECORD LAYOUT" << std::endl;
for (const auto& [rec_name, rec] : rec_list) {
std::cout << rec_name << std::endl;
}
std::cout << std::endl;
const auto& trans_list = module->Transformers();
//EXPECT_GT(trans_list.size(), 0);
std::cout << "\t\tTRANSFORMER" << std::endl;
for (const auto& [trans_name, trans] : trans_list) {
std::cout << trans_name << std::endl;
}
std::cout << std::endl;
const auto& taxis_list = module->TypedefAxiss();
//EXPECT_GT(taxis_list.size(), 0);
std::cout << "\t\tTYPEDEF AXIS" << std::endl;
for (const auto& [taxis_name, taxis] : taxis_list) {
std::cout << taxis_name << std::endl;
}
std::cout << std::endl;
const auto& tblob_list = module->TypedefBlobs();
//EXPECT_GT(tblob_list.size(), 0);
std::cout << "\t\tTYPEDEF BLOB" << std::endl;
for (const auto& [tblob_name, tblob] : tblob_list) {
std::cout << tblob_name << std::endl;
}
std::cout << std::endl;
const auto& tchar_list = module->TypedefCharacteristics();
//EXPECT_GT(tchar_list.size(), 0);
std::cout << "\t\tTYPEDEF CHARACTERISTIC" << std::endl;
for (const auto& [tchar_name, tchar] : tchar_list) {
std::cout << tchar_name << std::endl;
}
std::cout << std::endl;
const auto& tmeas_list = module->TypedefMeasurements();
//EXPECT_GT(tmeas_list.size(), 0);
std::cout << "\t\tTYPEDEF MEASUREMENT" << std::endl;
for (const auto& [tmeas_name, tmeas] : tmeas_list) {
std::cout << tmeas_name << std::endl;
}
std::cout << std::endl;
const auto& tstruct_list = module->TypedefStructures();
//EXPECT_GT(tstruct_list.size(), 0);
std::cout << "\t\tTYPEDEF STRUCTURE" << std::endl;
for (const auto& [tstruct_name, tstruct] : tstruct_list) {
std::cout << tstruct_name << std::endl;
}
std::cout << std::endl;
std::cout << std::endl;
const auto& unit_list = module->Units();
//EXPECT_GT(unit_list.size(), 0);
std::cout << "\t\tUNIT" << std::endl;
for (const auto& [unit_name, unit] : unit_list) {
std::cout << unit_name << std::endl;
}
std::cout << std::endl;
a2l::A2mlBlock a2ml_block(module->A2ml());
const auto& a2ml = module->A2ml();
const auto a2ml_parse = a2ml_block.IsOk();
//EXPECT_TRUE(a2ml_parse) << a2ml_block.LastError();
/*
const auto& block_list = a2ml_scanner.BlockList();
for (const auto& block : block_list) {
std::cout << block.AsString() << std::endl;
}
*/
}
}
void CIncSourceTestDlgDlg::AddLogString(std::string strMessage)
{
CListBox* pListBox = (CListBox*)GetDlgItem(IDC_LIST_DATA);
std::wstring message_w;
message_w.assign(strMessage.begin(), strMessage.end());
pListBox->AddString(message_w.c_str());
}

64
TestLibDlg/IncSourceTestDlg/IncSourceTestDlgDlg.h

@ -0,0 +1,64 @@

// IncSourceTestDlgDlg.h: 헤더 파일
//
#pragma once
#include <chrono>
#include <filesystem>
#include <map>
#include <string>
#include "a2l/a2lfile.h"
#include "a2l/a2mlblock.h"
#include "a2l/ifdatablock.h"
using namespace std::filesystem;
using namespace std::chrono_literals;
class CIncSourceTestDlgDlgAutoProxy;
// CIncSourceTestDlgDlg 대화 상자
class CIncSourceTestDlgDlg : public CDialogEx
{
DECLARE_DYNAMIC(CIncSourceTestDlgDlg);
friend class CIncSourceTestDlgDlgAutoProxy;
// 생성입니다.
public:
CIncSourceTestDlgDlg(CWnd* pParent = nullptr); // 표준 생성자입니다.
virtual ~CIncSourceTestDlgDlg();
// 대화 상자 데이터입니다.
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_INCSOURCETESTDLG_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
// 구현입니다.
protected:
CIncSourceTestDlgDlgAutoProxy* m_pAutoProxy;
HICON m_hIcon;
BOOL CanExit();
// 생성된 메시지 맵 함수
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnClose();
virtual void OnOK();
virtual void OnCancel();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedButtonOpen();
private:
void loadA2lFile(std::string strFilePath);
void AddLogString(std::string strMessage);
};

60
TestLibDlg/IncSourceTestDlg/framework.h

@ -0,0 +1,60 @@
#pragma once
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // 거의 사용되지 않는 내용은 Windows 헤더에서 제외합니다.
#endif
#include "targetver.h"
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 일부 CString 생성자는 명시적으로 선언됩니다.
// MFC의 공통 부분과 무시 가능한 경고 메시지에 대한 숨기기를 해제합니다.
#define _AFX_ALL_WARNINGS
#include <afxwin.h> // MFC 핵심 및 표준 구성 요소입니다.
#include <afxext.h> // MFC 확장입니다.
#include <afxdisp.h> // MFC 자동화 클래스입니다.
#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h> // Internet Explorer 4 공용 컨트롤에 대한 MFC 지원입니다.
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // Windows 공용 컨트롤에 대한 MFC 지원입니다.
#endif // _AFX_NO_AFXCMN_SUPPORT
#include <afxcontrolbars.h> // MFC의 리본 및 컨트롤 막대 지원
// 이 매크로는 TRUE를 전달한다는 점을 제외하면 IMPLEMENT_OLECREATE와 동일합니다
// 전달하는 점만 제외하면 IMPLEMENT_OLECREATE와 같습니다.
// 자동화 컨트롤러에서 요청한 각 자동화 프록시 개체에 대해
// 이 응용 프로그램에 대한 별도의 인스턴스가 시작되도록 합니다.
#ifndef IMPLEMENT_OLECREATE2
#define IMPLEMENT_OLECREATE2(class_name, external_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
AFX_DATADEF COleObjectFactory class_name::factory(class_name::guid, \
RUNTIME_CLASS(class_name), TRUE, _T(external_name)); \
const AFX_DATADEF GUID class_name::guid = \
{ l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } };
#endif // IMPLEMENT_OLECREATE2
#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif

253
TestLibDlg/IncSourceTestDlg/include/a2l/a2lenums.h

@ -0,0 +1,253 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <string>
#include <vector>
#include <string_view>
namespace a2l {
using EnumStringList = std::vector<std::string_view>;
enum class A2lAddressType {
PBYTE,
PWORD,
PLONG,
PLONGLONG,
DIRECT,
UNKNOWN
};
A2lAddressType StringToAddressType(const std::string& text);
std::string_view AddressTypeToString(A2lAddressType type);
EnumStringList AddressTypeToStringList();
enum class A2lAxisType {
CURVE_AXIS,
COM_AXIS,
FIX_AXIS,
RES_AXIS,
STD_AXIS,
UNKNOWN
};
A2lAxisType StringToAxisType(const std::string& text);
std::string_view AxisTypeToString(A2lAxisType type);
EnumStringList AxisTypeToStringList();
enum class A2lByteOrder {
MSB_FIRST,
MSB_LAST,
MSB_FIRST_MSW_LAST,
MSB_LAST_MSW_FIRST,
UNKNOWN
};
A2lByteOrder StringToByteOrder(const std::string& order);
std::string_view ByteOrderToString(A2lByteOrder type);
EnumStringList ByteOrderToStringList();
enum class A2lCalibrationAccess {
CALIBRATION,
NO_CALIBRATION,
NOT_IN_MCD_SYSTEM,
OFFLINE_CALIBRATION,
UNKNOWN
};
A2lCalibrationAccess StringToCalibrationAccess(const std::string& text);
std::string_view CalibrationAccessToString(A2lCalibrationAccess access);
EnumStringList CalibrationAccessToStringList();
enum class A2lCharacteristicType {
ASCII,
CURVE,
MAP,
CUBOID,
CUBE_4,
CUBE_5,
VAL_BLK,
VALUE,
UNKNOWN
};
A2lCharacteristicType StringToCharacteristicType(const std::string& text);
std::string_view CharacteristicTypeToString(A2lCharacteristicType type);
EnumStringList CharacteristicTypeToStringList();
enum class A2lConversionType {
IDENTICAL,
FORM,
LINEAR,
RAT_FUNC,
TAB_INP,
TAB_NOINTP,
TAB_VERB,
UNKNOWN
};
A2lConversionType StringToConversionType(const std::string& text);
std::string_view ConversionTypeToString(A2lConversionType type);
EnumStringList ConversionTypeToStringList();
enum class A2lDataType {
UBYTE,
SBYTE,
UWORD,
SWORD,
ULONG,
SLONG,
A_UINT64,
A_INT64,
FLOAT16_IEEE,
FLOAT32_IEEE,
FLOAT64_IEEE,
UNKNOWN
};
A2lDataType StringToDataType(const std::string& text);
std::string_view DataTypeToString(A2lDataType type);
EnumStringList DataTypeToStringList();
enum class A2lDeposit {
A2L_ABSOLUTE,
A2L_DIFFERENCE,
UNKNOWN
};
A2lDeposit StringToDeposit(const std::string& mode);
std::string_view DepositToString(A2lDeposit deposit);
EnumStringList DepositToStringList();
enum class A2lEncoding {
ASCII, ///< 8-bit characters
UTF8,
UTF16,
UTF32,
UNKNOWN
};
A2lEncoding StringToEncoding(const std::string& enc);
std::string_view EncodingToString(A2lEncoding encoding);
EnumStringList EncodingToStringList();
enum class A2lIndexMode {
ALTERNATE_CURVES,
ALTERNATE_WITH_X,
ALTERNATE_WITH_Y,
COLUMN_DIR,
ROW_DIR,
UNKNOWN
};
A2lIndexMode StringToIndexMode(const std::string& text);
std::string_view IndexModeToString(A2lIndexMode mode);
EnumStringList IndexModeToStringList();
enum class A2lIndexOrder {
INDEX_INCR,
INDEX_DECR,
UNKNOWN
};
A2lIndexOrder StringToIndexOrder(const std::string& text);
std::string_view IndexOrderToString(A2lIndexOrder order);
EnumStringList IndexOrderToStringList();
enum class A2lLayout {
ROW_DIR,
COLUMN_DIR,
UNKNOWN
};
A2lLayout StringToLayout(const std::string& text);
std::string_view LayoutToString(A2lLayout layout);
EnumStringList LayoutToStringList();
enum class A2lMemoryType {
EEPROM,
EPROM,
FLASH,
RAM,
ROM,
REGISTER,
NOT_IN_ECU,
UNKNOWN
};
A2lMemoryType StringToMemoryType(const std::string& text);
std::string_view MemoryTypeToString(A2lMemoryType type);
EnumStringList MemoryTypeToStringList();
enum class A2lMemoryAttribute {
INTERN,
EXTERN,
UNKNOWN
};
A2lMemoryAttribute StringToMemoryAttribute(const std::string& text);
std::string_view MemoryAttributeToString(A2lMemoryAttribute attr);
EnumStringList MemoryAttributeToStringList();
enum class A2lMonotony {
MON_DECREASE,
MON_INCREASE,
STRICT_DECREASE,
STRICT_INCREASE,
MONOTONOUS,
STRICT_MON,
NOT_MON,
UNKNOWN
};
A2lMonotony StringToMonotony(const std::string& text);
std::string_view MonotonyToString(A2lMonotony type);
EnumStringList MonotonyToStringList();
enum class A2lPrgType {
PRG_CODE,
PRG_DATA,
PRG_RESERVED,
UNKNOWN
};
A2lPrgType StringToPrgType(const std::string& text);
std::string_view PrgTypeToString(A2lPrgType type);
EnumStringList PrgTypeToStringList();
enum class A2lSegmentType {
CALIBRATION_VARIABLES,
CODE,
DATA,
EXCLUDE_FROM_FLASH,
OFFLINE_DATA,
RESERVED,
SERAM,
VARIABLES,
UNKNOWN
};
A2lSegmentType StringToSegmentType(const std::string& text);
std::string_view SegmentTypeToString(A2lSegmentType type);
EnumStringList SegmentTypeToStringList();
enum class A2lTrigger {
ON_CHANGE,
ON_USER_REQUEST,
UNKNOWN
};
A2lTrigger StringToTrigger(const std::string& text);
std::string_view TriggerToString(A2lTrigger trigger);
EnumStringList TriggerToStringList();
enum class A2lTypedefType {
TYPEDEF_AXIS,
TYPEDEF_BLOB,
TYPEDEF_CHARACTERISTIC,
TYPEDEF_MEASUREMENT,
TYPEDEF_STRUCTURE,
UNKNOWN
};
A2lTypedefType StringToTypedefType(const std::string& text);
std::string_view TypedefTypeToString(A2lTypedefType type);
EnumStringList TypedefTypeToStringList();
enum class A2lUnitType {
DERIVED,
EXTENDED_SI,
UNKNOWN
};
A2lUnitType StringToUnitType(const std::string& text);
std::string_view UnitTypeToString(A2lUnitType type);
EnumStringList UnitTypeToStringList();
} // end namespace

69
TestLibDlg/IncSourceTestDlg/include/a2l/a2lfile.h

@ -0,0 +1,69 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
/** \file a2lfile.h
* \brief The A2L file object is the main user object.
*/
#pragma once
#include <memory>
#include <sstream>
#include <string>
#include "a2l/a2lproject.h"
#include "a2l/a2lstructs.h"
namespace a2l {
/** \brief Main user object that is an interface against an A2L file.
*
* The A2L file is the only object the user shall create. It handle the parsing
* of the file. An A2L file defines an ECU and optional hoe it communicate.
*/
class A2lFile {
public:
/** \brief Sets the file name. Full path required. */
void Filename(const std::string& filename) {filename_ = filename; }
/** \brief Returns the file name with full path. */
[[nodiscard]] const std::string& Filename() const {return filename_; }
/** \brief Returns the File name without path and extension. */
[[nodiscard]] std::string Name() const;
/** \brief Returns the last (parser) error text. */
[[nodiscard]] const std::string& LastError() const { return last_error_; }
/** \brief Parses the A2L file. Returns true on success. */
[[nodiscard]] bool ParseFile();
[[nodiscard]] Asap2Version& A2lVersion() { return a2l_version_; }
[[nodiscard]] const Asap2Version& A2lVersion() const { return a2l_version_; }
[[nodiscard]] Asap2Version& A2mlVersion() { return a2ml_version_; }
[[nodiscard]] const Asap2Version& A2mlVersion() const {
return a2ml_version_;
}
[[nodiscard]] A2lProject& Project() { return project_; }
[[nodiscard]] const A2lProject& Project() const { return project_; }
void IsA2lFile(bool is_a2l_file) { found_ = is_a2l_file; }
[[nodiscard]] bool IsA2lFile() const { return found_; }
void Merge(A2lFile& include_file);
private:
bool found_ = false;
std::string filename_; ///< Full path name
mutable std::string last_error_; ///< Last error message
Asap2Version a2l_version_;
Asap2Version a2ml_version_;
A2lProject project_;
};
} // namespace dbc

147
TestLibDlg/IncSourceTestDlg/include/a2l/a2lobject.h

@ -0,0 +1,147 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <cstdint>
#include <string>
#include <map>
#include "a2l/a2lenums.h"
#include "a2l/a2lstructs.h"
namespace a2l {
/** \brief if_data strings sorted in protocol order */
using IfDataList = std::map<std::string, std::string>;
class A2lObject {
public:
virtual ~A2lObject() = default;
void Name(const std::string& name) { name_ = name; }
[[nodiscard]] const std::string& Name() const { return name_; }
void ByteOrder(A2lByteOrder order) { byte_order_ = order; }
[[nodiscard]] A2lByteOrder ByteOrder() const { return byte_order_; }
void CalibrationAccess(A2lCalibrationAccess access) {
calibration_access_ = access;
}
[[nodiscard]] A2lCalibrationAccess CalibrationAccess() const {
return calibration_access_;
}
void Description(const std::string& description) {
description_ = description;
}
[[nodiscard]] const std::string& Description() const { return description_; }
void Discrete(bool discrete) { discrete_ = discrete; }
[[nodiscard]] bool Discrete() const { return discrete_; }
void DisplayIdentifier(const std::string& name) {
display_identifier_ = name;
}
[[nodiscard]] const std::string& DisplayIdentifier() const {
return display_identifier_;
}
void EcuAddressExtension(int64_t ext) {
ecu_address_extension_ = ext;
}
[[nodiscard]] int64_t EcuAddressExtension() const {
return ecu_address_extension_;
}
void ExtendedLimits(const A2lExtendedLimits& limits) {
extended_limits_ = limits;
}
[[nodiscard]] const A2lExtendedLimits& ExtendedLimits() const {
return extended_limits_;
}
void Format(const std::string& format) {format_ = format; }
[[nodiscard]] const std::string& Format() const { return format_; }
void FunctionList(const std::vector<std::string>& list) {
function_list_ = list;
}
[[nodiscard]] const std::vector<std::string>& FunctionList() const {
return function_list_;
}
void GuardRails(bool guard_rails) { guard_rails_ = guard_rails; }
[[nodiscard]] bool GuardRails() const { return guard_rails_; };
void MatrixDim(const std::vector<uint64_t>& list) { matrix_dim_ = list; }
[[nodiscard]] const std::vector<uint64_t>& MatrixDim() const {
return matrix_dim_;
}
void MaxRefresh(const A2lMaxRefresh& rate) { max_refresh_ = rate; }
[[nodiscard]] const A2lMaxRefresh& MaxRefresh() const { return max_refresh_; };
void ModelLink(const std::string& link) { model_link_ = link; }
[[nodiscard]] const std::string& ModelLink() const { return model_link_; }
void PhysUnit(const std::string& unit) { phys_unit_ = unit; }
[[nodiscard]] const std::string& PhysUnit() const { return phys_unit_; }
void ReadOnly(bool read_only) { read_only_ = read_only; }
[[nodiscard]] bool ReadOnly() const { return read_only_; }
void RefMemorySegment(const std::string& segment) {
ref_memory_segment_ = segment;
}
[[nodiscard]] const std::string& RefMemorySegment() const {
return ref_memory_segment_;
}
void StepSize(double step_size) { step_size_ = step_size; }
[[nodiscard]] double StepSize() const { return step_size_; }
void SymbolLink(const A2lSymbolLink& symbol) { symbol_link_ = symbol; }
[[nodiscard]] const A2lSymbolLink& SymbolLink() const { return symbol_link_; }
void AddAnnotation(const A2lAnnotation& annotation);
[[nodiscard]] AnnotationList& Annotations() {
return annotation_list_;
}
[[nodiscard]] const AnnotationList& Annotations() const {
return annotation_list_;
}
void AddIfData(const std::string& input);
[[nodiscard]] const IfDataList& IfDatas() const { return if_data_list_;}
[[nodiscard]] bool HaveIfData() const { return !if_data_list_.empty();}
[[nodiscard]] bool HaveIfData(const std::string_view& protocol) const;
private:
std::string name_;
std::string description_;
A2lByteOrder byte_order_ = A2lByteOrder::UNKNOWN;
A2lCalibrationAccess calibration_access_ = A2lCalibrationAccess::UNKNOWN;
bool discrete_ = false;
std::string display_identifier_;
int64_t ecu_address_extension_ = 0;
A2lExtendedLimits extended_limits_ = {};
std::string format_;
std::vector<std::string> function_list_;
bool guard_rails_ = false;
std::vector<uint64_t> matrix_dim_;
A2lMaxRefresh max_refresh_;
std::string model_link_;
std::string phys_unit_;
bool read_only_ = false;
std::string ref_memory_segment_;
double step_size_ = 0.0;
A2lSymbolLink symbol_link_;
IfDataList if_data_list_;
AnnotationList annotation_list_;
};
} // end namespace

34
TestLibDlg/IncSourceTestDlg/include/a2l/a2lproject.h

@ -0,0 +1,34 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <map>
#include <memory>
#include <string>
#include "a2l/a2lobject.h"
#include "a2l/a2lstructs.h"
#include "a2l/module.h"
namespace a2l {
using ModuleList = std::map<std::string, std::unique_ptr<Module>>;
class A2lProject : public A2lObject {
public:
[[nodiscard]] A2lHeader& Header() { return header_;}
[[nodiscard]] const A2lHeader& Header() const { return header_;}
void AddModule(std::unique_ptr<Module>& module );
[[nodiscard]] const ModuleList& Modules() const { return module_list_; }
[[nodiscard]] ModuleList& Modules() { return module_list_; }
private:
A2lHeader header_;
ModuleList module_list_;
};
} // namespace a2l

257
TestLibDlg/IncSourceTestDlg/include/a2l/a2lstructs.h

@ -0,0 +1,257 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <cstdint>
#include <string>
#include <vector>
#include <map>
#include <memory>
#include "a2l/a2lenums.h"
namespace a2l {
struct Asap2Version {
uint64_t VersionNo = 0;
uint64_t UpgradeNo = 0;
void FromString(const std::string& version) {
// Assume "Version.Upgrade"
try {
const auto dot = version.find('.');
if (dot == std::string::npos) {
VersionNo = std::stoull(version);
} else {
VersionNo = std::stoull(version.substr(0, dot));
UpgradeNo = std::stoull(version.substr(dot + 1));
}
} catch (const std::exception& ) {}
}
};
struct A2lAnnotation {
std::string Label;
std::string Origin;
std::vector<std::string> Text;
};
using AnnotationList = std::vector<A2lAnnotation>;
struct A2lAxisPts {
uint64_t Position = 0;
A2lDataType DataType = A2lDataType::UNKNOWN;
A2lIndexOrder IndexOrder = A2lIndexOrder::UNKNOWN;
A2lAddressType AddressType = A2lAddressType::UNKNOWN;
};
struct A2lAxisRescale {
uint64_t Position = 0;
A2lDataType DataType = A2lDataType::UNKNOWN;
uint64_t MaxNoRescalePairs = 0;
A2lIndexOrder IndexOrder = A2lIndexOrder::UNKNOWN;
A2lAddressType AddressType = A2lAddressType::UNKNOWN;
};
struct A2lBitOperation {
uint64_t LeftShift = 0;
uint64_t RightShift = 0;
bool SignExtended = false;
};
struct A2lCalibrationHandle {
std::string Comment;
std::vector<int64_t> HandleList;
};
struct A2lCalibrationMethod {
std::string Method;
uint64_t Version = 0;
std::vector<A2lCalibrationHandle> CalibrationHandleList;
};
struct A2lControllerAddress {
uint64_t Index = 0;
A2lByteOrder ByteOrder = A2lByteOrder::MSB_LAST;
uint64_t StartAddress = 0;
uint64_t Length = 0;
};
using ControllerAddressList = std::vector<A2lControllerAddress>;
struct A2lDependentCharacteristic {
std::string Formula;
std::vector<std::string> CharacteristicList;
};
struct A2lDistOp {
uint64_t Position = 0;
A2lDataType DataType = A2lDataType::UNKNOWN;
};
struct A2lExtendedLimits {
double LowerLimits = 0.0;
double UpperLimits = 0.0;
};
struct A2lFixAxisPar {
double Offset = 0.0;
double Shift = 0.0;
uint64_t NoAxisPoints = 0;
};
struct A2lFixAxisParDist {
double Offset = 0.0;
double Distance = 0.0;
uint64_t NoAxisPoints = 0;
};
struct A2lFncValue {
uint64_t Position = 0;
A2lDataType DataType = A2lDataType::UNKNOWN;
A2lIndexMode IndexMode = A2lIndexMode::UNKNOWN;
A2lAddressType AddressType = A2lAddressType::UNKNOWN;
};
struct A2lHeader {
std::string Comment;
std::string VersionNo;
std::string ProjectNo;
};
struct A2lIdentification {
uint64_t Position = 0;
A2lDataType DataType = A2lDataType::UNKNOWN;
};
struct A2lLimits {
double LowerLimit = 0.0;
double UpperLimit = 0.0;
};
struct A2lMaxRefresh {
uint64_t ScalingUnit = 0;
uint64_t Rate = 0;
};
struct A2lMemoryLayout {
A2lPrgType Type = A2lPrgType::UNKNOWN;
uint64_t Address = 0;
uint64_t Size = 0;
std::vector<int64_t> OffsetList;
std::map<std::string, std::string> IfDataList;
};
struct A2lMemorySegment {
std::string Name;
std::string Description;
A2lSegmentType SegmentType = A2lSegmentType::UNKNOWN;
A2lMemoryType MemoryType = A2lMemoryType::UNKNOWN;
A2lMemoryAttribute Attribute = A2lMemoryAttribute::UNKNOWN;
uint64_t Address = 0;
uint64_t Size = 0;
std::vector<int64_t> OffsetList;
std::map<std::string, std::string> IfDataList;
};
struct A2lModCommon {
std::string Comment;
uint64_t AlignmentByte = 0;
uint64_t AlignmentWord = 0;
uint64_t AlignmentLong = 0;
uint64_t AlignmentInt64 = 0;
uint64_t AlignmentFloat16 = 0;
uint64_t AlignmentFloat32 = 0;
uint64_t AlignmentFloat64 = 0;
A2lByteOrder ByteOrder = A2lByteOrder::UNKNOWN;
uint64_t DataSize = 0;
A2lDeposit Deposit = A2lDeposit::UNKNOWN;
};
struct A2lModPar {
std::string Comment;
std::vector<uint64_t> AddressEpkList;
std::vector<A2lCalibrationMethod> CalibrationMethodList;
std::string CpuType;
std::string Customer;
std::string CustomerNo;
std::string Ecu;
int64_t EcuCalibrationOffset = 0;
std::string Epk;
std::vector<A2lMemoryLayout> MemoryLayoutList;
std::vector<A2lMemorySegment> MemorySegmentList;
uint64_t NoOfInterfaces = 0;
std::string PhoneNo;
std::string Supplier;
std::map<std::string, std::string> SystemConstantList;
std::string User;
std::string Version;
};
struct A2lSiExponents {
int64_t Length = 0;
int64_t Mass = 0;
int64_t Time = 0;
int64_t ElectricCurrent = 0;
int64_t Temperature = 0;
int64_t AmountOfSubstance = 0;
int64_t LuminousIntensity = 0;
[[nodiscard]] bool HasExponent() const {
return Length != 0 || Mass != 0 || Time != 0 || ElectricCurrent != 0 ||
Temperature != 0 || AmountOfSubstance != 0 || LuminousIntensity != 0;
}
};
struct A2lStructureComponent {
std::string Name;
std::string Typedef;
uint64_t AddressOffset = 0;
A2lAddressType AddressType = A2lAddressType::DIRECT;
A2lLayout Layout = A2lLayout::ROW_DIR;
std::vector<uint64_t> MatrixDim;
std::string SymbolTypeLink;
};
using StructureComponentList = std::map<std::string,
std::unique_ptr<A2lStructureComponent>>;
struct A2lSymbolLink {
std::string SymbolName;
int64_t Offset = 0;
};
struct A2lUserRight {
std::string UserLevelId;
bool ReadOnly = false;
std::vector<std::vector<std::string>> RefGroupList;
};
using UserRightList = std::map<std::string, std::unique_ptr<A2lUserRight>>;
struct A2lVarCharacteristic {
std::string Name;
std::vector<std::string> CriterionNameList;
std::vector<uint64_t> AddressList;
};
struct A2lVarCriterion {
std::string Name;
std::string Description;
std::vector<std::string> ValueList;
std::string Measurement;
std::string SelectionCharacteristic;
};
struct A2lVariantCoding {
std::map<std::string, A2lVarCharacteristic> CharacteristicList;
std::map<std::string, A2lVarCriterion> CriterionList;
std::vector<std::map<std::string, std::string>> ForbiddenCombList;
std::string Naming;
std::string Separator;
[[nodiscard]] bool HasCoding() const {
return !CharacteristicList.empty() || !CriterionList.empty() ||
!ForbiddenCombList.empty() || !Naming.empty() || !Separator.empty();
}
};
} // end namespace a2l

28
TestLibDlg/IncSourceTestDlg/include/a2l/a2mlblock.h

@ -0,0 +1,28 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include "a2l/a2mlobject.h"
#include <string>
namespace a2l {
class A2mlBlock {
public:
explicit A2mlBlock(const std::string& a2ml);
[[nodiscard]] bool IsOk() const { return parse_; }
[[nodiscard]] const A2mlBlockList& BlockList() const { return block_list_; }
[[nodiscard]] const std::string& LastError() const { return last_error_; }
private:
bool parse_ = false;
std::string last_error_;
A2mlBlockList block_list_;
};
} // namespace a2l

90
TestLibDlg/IncSourceTestDlg/include/a2l/a2mlobject.h

@ -0,0 +1,90 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <cstdint>
#include <vector>
#include <map>
#include <string>
namespace a2l {
enum class A2mlTypeName : int {
PREDEFINED,
STRUCT,
TAGGED_STRUCT,
TAGGED_UNION,
ENUMERATE,
BLOCK,
UNKNOWN
};
enum class A2mlDataType : int {
CHAR,
INT,
LONG,
INT64,
UCHAR,
UINT,
UINT64,
ULONG,
DOUBLE,
FLOAT,
TEXT_ARRAY,
UNKNOWN
};
class A2mlObject;
using A2mlMemberList = std::vector<A2mlObject>;
using A2mlEnumerateList = std::map<int64_t, std::string>;
using A2mlBlockList = A2mlMemberList;
class A2mlObject {
public:
A2mlObject() = default;
explicit A2mlObject(A2mlTypeName type);
void Ident(const std::string& ident) { ident_ = ident; }
[[nodiscard]] const std::string& Ident() const { return ident_; }
void Tag(const std::string& tag) { tag_ = tag; }
[[nodiscard]] const std::string& Tag() const { return tag_; }
void Type(A2mlTypeName type) { type_ = type; }
[[nodiscard]] A2mlTypeName Type() const { return type_; }
[[nodiscard]] std::string_view TypeAsString() const;
void DataType(A2mlDataType type) { data_type_ = type; }
[[nodiscard]] A2mlDataType DataType() const { return data_type_; }
[[nodiscard]] std::string_view DataTypeAsString() const;
void MemberList(const A2mlMemberList& list) { member_list_ = list; }
[[nodiscard]] A2mlMemberList& MemberList() { return member_list_; }
[[nodiscard]] const A2mlMemberList& MemberList() const {
return member_list_;
}
void EnumerateList(const A2mlEnumerateList& list) { enumerate_list_ = list; }
[[nodiscard]] A2mlEnumerateList& EnumerateList() { return enumerate_list_; }
[[nodiscard]] const A2mlEnumerateList& EnumerateList() const {
return enumerate_list_;
}
[[nodiscard]] std::string AsString() const;
private:
std::string tag_;
std::string ident_;
A2mlMemberList member_list_;
A2mlEnumerateList enumerate_list_;
A2mlTypeName type_ = A2mlTypeName::UNKNOWN;
A2mlDataType data_type_ = A2mlDataType::UNKNOWN;
};
} // namespace a2l

92
TestLibDlg/IncSourceTestDlg/include/a2l/axispts.h

@ -0,0 +1,92 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <memory>
#include <map>
#include <cstdint>
#include "a2l/a2lobject.h"
#include "a2l/a2lenums.h"
namespace a2l {
class AxisPts : public A2lObject {
public:
void Address(uint64_t address) { address_ = address; }
[[nodiscard]] uint64_t Address() const { return address_; }
void InputQuantity(const std::string& quantity) {
if (quantity != "NO_INPUT_QUANTITY") {
input_quantity_ = quantity;
} else {
input_quantity_.clear();
}
}
[[nodiscard]] const std::string& InputQuantity() const {
return input_quantity_;
}
void RefRecord(const std::string& ref) {
ref_record_ = ref;
}
[[nodiscard]] const std::string& RefRecord() const {
return ref_record_;
}
void MaxDiff(double max_diff) { max_diff_ = max_diff; }
[[nodiscard]] double MaxDiff() const { return max_diff_; }
void Conversion(const std::string& conversion) {
if (conversion != "NO_COMPU_METHOD") {
conversion_ = conversion;
} else {
conversion_.clear();
}
}
[[nodiscard]] const std::string& Conversion() const {
return conversion_;
}
void MaxAxisPoints(uint64_t nof) { max_axis_points_ = nof; }
[[nodiscard]] uint64_t MaxAxisPoints() const { return max_axis_points_; }
void LowerLimit(double limit) { lower_limit_ = limit; }
[[nodiscard]] double LowerLimit() const { return lower_limit_; }
void UpperLimit(double limit) { upper_limit_ = limit; }
[[nodiscard]] double UpperLimit() const { return upper_limit_; }
void Deposit(A2lDeposit deposit) {
deposit_ = deposit;
}
[[nodiscard]] A2lDeposit Deposit() const {
return deposit_;
}
void Monotony(A2lMonotony monotony) { monotony_ = monotony; }
[[nodiscard]] A2lMonotony Monotony() const { return monotony_; }
private:
uint64_t address_ = 0;
std::string input_quantity_;
std::string ref_record_; ///< Named deposit in standard
double max_diff_ = 0.0;
std::string conversion_;
uint64_t max_axis_points_ = 0;
double lower_limit_ = 0.0;
double upper_limit_ = 0.0;
A2lDeposit deposit_ = A2lDeposit::UNKNOWN;
A2lExtendedLimits extended_limits_;
A2lMonotony monotony_ = A2lMonotony::UNKNOWN;
};
using AxisPtsList = std::map<std::string, std::unique_ptr<AxisPts>>;
} // namespace a2l

32
TestLibDlg/IncSourceTestDlg/include/a2l/blob.h

@ -0,0 +1,32 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <cstdint>
#include <memory>
#include "a2l/a2lobject.h"
namespace a2l {
class Blob : public A2lObject {
public:
void Address(uint64_t address) { address_ = address; }
[[nodiscard]] uint64_t Address() const { return address_; }
void Size(uint64_t size) { size_ = size; }
[[nodiscard]] uint64_t Size() const { return size_;}
void AddressType(A2lAddressType type) { address_type_ = type; }
[[nodiscard]] A2lAddressType AddressType() const { return address_type_;}
private:
uint64_t address_ = 0;
uint64_t size_ = 0;
A2lAddressType address_type_ = A2lAddressType::UNKNOWN;
};
using BlobList = std::map<std::string, std::unique_ptr<Blob>>;
} // end namespace a2l

105
TestLibDlg/IncSourceTestDlg/include/a2l/characteristic.h

@ -0,0 +1,105 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <memory>
#include <cstdint>
#include <vector>
#include <map>
#include "a2l/a2lobject.h"
#include "a2l/a2lenums.h"
#include "a2l/axisdescr.h"
namespace a2l {
class Characteristic : public A2lObject {
public:
void Address(uint64_t address) { address_ = address; }
[[nodiscard]] uint64_t Address() const { return address_; }
void BitMask(uint64_t mask) { bit_mask_ = mask; }
[[nodiscard]] uint64_t BitMask() const { return bit_mask_; }
void ComparisonQuantity(const std::string& quantity) {
comparison_quantity_ = quantity;
}
[[nodiscard]] const std::string& ComparisonQuantity() const {
return comparison_quantity_;
}
void Conversion(const std::string& conversion) { conversion_ = conversion; }
[[nodiscard]] const std::string& Conversion() const { return conversion_; }
void DependentCharacteristic(const A2lDependentCharacteristic& dependent) {
dependent_characteristic_ = dependent;
}
[[nodiscard]] const A2lDependentCharacteristic& DependentCharacteristic()
const { return dependent_characteristic_;
}
void Deposit(const std::string& deposit) { deposit_ = deposit; }
[[nodiscard]] const std::string& Deposit() const { return deposit_; }
void Encoding(A2lEncoding encoding) { encoding_ = encoding; }
[[nodiscard]] A2lEncoding Encoding() const { return encoding_; }
void MapList(const std::vector<std::string>& list) { map_list_ = list; }
[[nodiscard]] const std::vector<std::string>& MapList() const {
return map_list_;
}
void MaxDiff(double diff) { max_diff_ = diff; }
[[nodiscard]] double MaxDiff() const { return max_diff_; }
void LowerLimit(double limit) { lower_limit_ = limit; }
[[nodiscard]] double LowerLimit() const { return lower_limit_; }
void UpperLimit(double limit) { upper_limit_ = limit; }
[[nodiscard]] double UpperLimit() const { return upper_limit_; }
void Number(uint64_t number) { number_ = number; }
[[nodiscard]] uint64_t Number() const { return number_; }
void Type(A2lCharacteristicType type) { type_ = type; }
[[nodiscard]] A2lCharacteristicType Type() const { return type_; }
void VirtualCharacteristic(const A2lDependentCharacteristic& virt) {
virtual_characteristic_ = virt;
}
[[nodiscard]] const A2lDependentCharacteristic& VirtualCharacteristic()
const { return virtual_characteristic_;
}
void AddAxisDescr(std::unique_ptr<AxisDescr>& axis_descr);
[[nodiscard]] AxisDescrList& AxisDescriptions() {
return axis_descr_list_;
}
[[nodiscard]] const AxisDescrList& AxisDescriptions() const {
return axis_descr_list_;
}
private:
A2lCharacteristicType type_ = A2lCharacteristicType::UNKNOWN;
AxisDescrList axis_descr_list_;
uint64_t address_ = 0;
uint64_t bit_mask_ = 0;
std::string comparison_quantity_;
std::string conversion_;
A2lDependentCharacteristic dependent_characteristic_ = {};
std::string deposit_;
A2lEncoding encoding_ = A2lEncoding::ASCII;
std::vector<std::string> map_list_;
double max_diff_ = 0;
double lower_limit_ = 0.0;
double upper_limit_ = 0.0;
uint64_t number_ = 0;
A2lDependentCharacteristic virtual_characteristic_ = {};
};
using CharacteristicList = std::map<std::string,
std::unique_ptr<Characteristic>>;
} // end namespace a2l

64
TestLibDlg/IncSourceTestDlg/include/a2l/compumethod.h

@ -0,0 +1,64 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <memory>
#include <string>
#include <vector>
#include <map>
#include "a2l/a2lobject.h"
#include "a2l/a2lenums.h"
namespace a2l {
class CompuMethod : public A2lObject {
public:
void Type(A2lConversionType type) { conversion_type_ = type; }
[[nodiscard]] A2lConversionType Type() const { return conversion_type_; }
void Coeffs(const std::vector<double>& list) { coeffs_ = list; }
[[nodiscard]] const std::vector<double>& Coeffs() const { return coeffs_; }
void CoeffsLinear(const std::vector<double>& list) {
coeffs_linear_ = list;
}
[[nodiscard]] const std::vector<double>& CoeffsLinear() const {
return coeffs_linear_;
}
void CompuTabRef(const std::string& ref) { compu_tab_ref_ = ref; }
[[nodiscard]] const std::string& CompuTabRef() const {
return compu_tab_ref_;
}
void Formula(const std::string& formula) { formula_ = formula; }
[[nodiscard]] const std::string& Formula() const { return formula_; }
void FormulaInv(const std::string& formula) { formula_inv_ = formula; }
[[nodiscard]] const std::string& FormulaInv() const { return formula_inv_; }
void RefUnit(const std::string& unit) { ref_unit_ = unit; }
[[nodiscard]] const std::string& RefUnit() const { return ref_unit_; }
void StatusStringRef(const std::string& ref) { status_string_ref_ = ref; }
[[nodiscard]] const std::string& StatusStringRef() const {
return status_string_ref_;
}
private:
A2lConversionType conversion_type_ = A2lConversionType::UNKNOWN;
std::vector<double> coeffs_;
std::vector<double> coeffs_linear_;
std::string compu_tab_ref_;
std::string formula_;
std::string formula_inv_;
std::string ref_unit_;
std::string status_string_ref_;
};
using CompuMethodList = std::map<std::string, std::unique_ptr<CompuMethod>>;
}

46
TestLibDlg/IncSourceTestDlg/include/a2l/compuvtab.h

@ -0,0 +1,46 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <map>
#include <memory>
#include <string>
#include <cstdint>
#include "a2l/a2lobject.h"
namespace a2l {
class CompuVtab : public A2lObject {
public:
void Type(A2lConversionType type) { conversion_type_ = type; }
[[nodiscard]] A2lConversionType Type() const { return conversion_type_; }
void Rows(uint64_t rows) { rows_ = rows; }
[[nodiscard]] uint64_t Rows() const { return rows_; }
void KeyValueList(const std::map<double, std::string>& list) {
value_list_ = list;
}
[[nodiscard]] const std::map<double, std::string>& KeyValueList() const {
return value_list_;
}
void DefaultValue(const std::string& value) { default_value_ = value; }
[[nodiscard]] const std::string& DefaultValue() const {
return default_value_;
}
private:
A2lConversionType conversion_type_ = A2lConversionType::TAB_VERB;
uint64_t rows_ = 0;
std::map<double, std::string> value_list_;
std::string default_value_;
};
using CompuVtabList = std::map<std::string, std::unique_ptr<CompuVtab>>;
} // end namespace a2l

47
TestLibDlg/IncSourceTestDlg/include/a2l/compuvtabrange.h

@ -0,0 +1,47 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <map>
#include <memory>
#include <string>
#include <cstdint>
#include <utility>
#include "a2l/a2lobject.h"
namespace a2l {
class CompuVtabRange : public A2lObject {
public:
void Rows(uint64_t rows) { rows_ = rows; }
[[nodiscard]] uint64_t Rows() const { return rows_; }
void KeyValueList(const std::map<std::pair<double, double>,
std::string>& list) {
value_list_ = list;
}
[[nodiscard]] const std::map<std::pair<double,double>,
std::string>& KeyValueList() const {
return value_list_;
}
void DefaultValue(const std::string& value) { default_value_ = value; }
[[nodiscard]] const std::string& DefaultValue() const {
return default_value_;
}
private:
uint64_t rows_ = 0;
std::map<std::pair<double, double>, std::string> value_list_;
std::string default_value_;
};
using CompuVtabRangeList = std::map<std::string,
std::unique_ptr<CompuVtabRange>>;
} // end namespace a2l

40
TestLibDlg/IncSourceTestDlg/include/a2l/frame.h

@ -0,0 +1,40 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <map>
#include <memory>
#include <string>
#include <cstdint>
#include <vector>
#include "a2l/a2lobject.h"
namespace a2l {
class Frame : public A2lObject {
public:
void ScalingUnit(uint64_t scale) { scaling_unit_ = scale; }
[[nodiscard]] uint64_t ScalingUnit() const { return scaling_unit_; }
void Rate(uint64_t rate) { rate_ = rate; }
[[nodiscard]] uint64_t Rate() const { return rate_; }
void FrameMeasurement(const std::vector<std::string>& list) {
frame_measurement_list_ = list;
}
[[nodiscard]] const std::vector<std::string>& FrameMeasurement() const {
return frame_measurement_list_;
}
private:
uint64_t scaling_unit_ = 0;
uint64_t rate_ = 0;
std::vector<std::string> frame_measurement_list_;
};
using FrameList = std::map<std::string, std::unique_ptr<Frame>>;
} // end namespace a2l

88
TestLibDlg/IncSourceTestDlg/include/a2l/function.h

@ -0,0 +1,88 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <map>
#include <memory>
#include <string>
#include <vector>
#include "a2l/a2lobject.h"
namespace a2l {
class Function : public A2lObject {
public:
void ComponentType(const std::string& type) { component_type_ = type; }
[[nodiscard]] const std::string& ComponentType() const {
return component_type_;
}
void PrototypeOf(const std::string& type) { prototype_of_ = type; }
[[nodiscard]] const std::string& PrototypeOf() const {
return prototype_of_;
}
void DefaultCharacteristics(const std::vector<std::string>& list) {
default_characteristic_list_ = list;
}
[[nodiscard]] const std::vector<std::string>& DefaultCharacteristics() const {
return default_characteristic_list_;
}
void Version(const std::string& version) { version_ = version; }
[[nodiscard]] const std::string& Version() const { return version_; }
void InMeasurements(const std::vector<std::string>& list) {
in_measurement_list_ = list;
}
[[nodiscard]] const std::vector<std::string>& InMeasurements() const {
return in_measurement_list_;
}
void LocMeasurements(const std::vector<std::string>& list) {
loc_measurement_list_ = list;
}
[[nodiscard]] const std::vector<std::string>& LocMeasurements() const {
return loc_measurement_list_;
}
void OutMeasurements(const std::vector<std::string>& list) {
out_measurement_list_ = list;
}
[[nodiscard]] const std::vector<std::string>& OutMeasurements() const {
return out_measurement_list_;
}
void RefCharacteristics(const std::vector<std::string>& list) {
ref_characteristic_list_ = list;
}
[[nodiscard]] const std::vector<std::string>& RefCharacteristics() const {
return ref_characteristic_list_;
}
void SubFunctions(const std::vector<std::string>& list) {
sub_function_list_ = list;
}
[[nodiscard]] const std::vector<std::string>& SubFunctions() const {
return sub_function_list_;
}
private:
std::string component_type_;
std::string prototype_of_;
std::vector<std::string> default_characteristic_list_;
std::string version_;
std::vector<std::string> in_measurement_list_;
std::vector<std::string> loc_measurement_list_;
std::vector<std::string> out_measurement_list_;
std::vector<std::string> ref_characteristic_list_;
std::vector<std::string> sub_function_list_;
};
using FuncList = std::map<std::string, std::unique_ptr<Function>>;
} // end namespace a2l

50
TestLibDlg/IncSourceTestDlg/include/a2l/group.h

@ -0,0 +1,50 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <map>
#include <memory>
#include <string>
#include <vector>
#include "a2l/a2lobject.h"
namespace a2l {
class Group : public A2lObject {
public:
void Root(bool root) { root_ = root; }
[[nodiscard]] bool Root() const { return root_; }
void RefCharacteristics(const std::vector<std::string>& list) {
ref_characteristic_list_ = list;
}
[[nodiscard]] const std::vector<std::string>& RefCharacteristics() const {
return ref_characteristic_list_;
}
void RefMeasurements(const std::vector<std::string>& list) {
ref_measurement_list_ = list;
}
[[nodiscard]] const std::vector<std::string>& RefMeasurements() const {
return ref_measurement_list_;
}
void SubGroups(const std::vector<std::string>& list) {
sub_group_list_ = list;
}
[[nodiscard]] const std::vector<std::string>& SubGroups() const {
return sub_group_list_;
}
private:
bool root_ = false;
std::vector<std::string> ref_characteristic_list_;
std::vector<std::string> ref_measurement_list_;
std::vector<std::string> sub_group_list_;
};
using GroupList = std::map<std::string, std::unique_ptr<Group>>;
} // end namespace a2l

40
TestLibDlg/IncSourceTestDlg/include/a2l/ifdatablock.h

@ -0,0 +1,40 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <string>
#include <vector>
#include "a2l/ifdataitem.h"
namespace a2l {
class IfDataBlock {
public:
explicit IfDataBlock(const std::string& ifdata);
[[nodiscard]] bool IsOk() const { return parse_; }
[[nodiscard]] const std::string& Protocol() const {
return protocol_;
}
[[nodiscard]] const std::vector<IfDataItem>& ItemList() const {
return item_list_;
}
[[nodiscard]] const std::string& LastError() const { return last_error_; }
[[nodiscard]] std::string AsString() const;
private:
bool parse_ = false;
std::string last_error_;
std::string protocol_;
std::vector<IfDataItem> item_list_;
[[nodiscard]] std::string AsString(size_t tab_level,
const IfDataItem& block_item) const;
};
} // namespace a2l

20
TestLibDlg/IncSourceTestDlg/include/a2l/ifdataitem.h

@ -0,0 +1,20 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <string>
#include <vector>
#include <cstdint>
namespace a2l {
struct IfDataItem {
std::string Value;
std::string BlockName;
std::vector<IfDataItem> ItemList;
};
} // end namespace a2l

49
TestLibDlg/IncSourceTestDlg/include/a2l/instance.h

@ -0,0 +1,49 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <map>
#include <memory>
#include <string>
#include <cstdint>
#include "a2l/a2lobject.h"
#include "a2l/overwrite.h"
namespace a2l {
class Instance : public A2lObject {
public:
void RefTypeDef(const std::string& type) { ref_type_def_ = type; }
[[nodiscard]] const std::string& RefTypeDef() const {
return ref_type_def_;
}
void Address(uint64_t address) { address_ = address; }
[[nodiscard]] uint64_t Address() const { return address_; }
void AddressType(A2lAddressType type) { address_type_ = type; }
[[nodiscard]] A2lAddressType AddressType() const { return address_type_; }
void Layout(A2lLayout layout) { layout_ = layout; }
[[nodiscard]] A2lLayout Layout() const { return layout_; }
void AddOverwrite(std::unique_ptr<Overwrite>& overwrite);
[[nodiscard]] const OverwriteList& Overwrites() const {
return overwrite_list_;
}
void ReadWrite(bool read_write) { read_write_ = read_write; }
[[nodiscard]] bool ReadWrite() const { return read_write_; }
private:
std::string ref_type_def_;
uint64_t address_ = 0;
A2lAddressType address_type_ = A2lAddressType::UNKNOWN;
A2lLayout layout_ = A2lLayout::UNKNOWN;
OverwriteList overwrite_list_;
bool read_write_ = false;
};
using InstanceList = std::map< std::string, std::unique_ptr<Instance>>;
} // end namespace a2l

92
TestLibDlg/IncSourceTestDlg/include/a2l/measurement.h

@ -0,0 +1,92 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <map>
#include <memory>
#include <string>
#include <cstdint>
#include <vector>
#include "a2l/a2lobject.h"
namespace a2l {
class Measurement : public A2lObject {
public:
void DataType(A2lDataType type) { data_type_ = type; }
[[nodiscard]] A2lDataType DataType() const { return data_type_; }
void Conversion(const std::string& conversion) { conversion_ = conversion; }
[[nodiscard]] const std::string& Conversion() const { return conversion_; }
void Resolution(uint64_t resolution) { resolution_ = resolution; }
[[nodiscard]] uint64_t Resolution() const { return resolution_; }
void Accuracy(double accuracy) { accuracy_ = accuracy; }
[[nodiscard]] double Accuracy() const { return accuracy_; }
void LowerLimit(double limit) { lower_limit_ = limit; }
[[nodiscard]] double LowerLimit() const { return lower_limit_; }
void UpperLimit(double limit) { upper_limit_ = limit; }
[[nodiscard]] double UpperLimit() const { return upper_limit_; }
void AddressType(A2lAddressType type) { address_type_ = type; }
[[nodiscard]] A2lAddressType AddressType() const { return address_type_; }
void ArraySize(uint64_t size) { array_size_ = size; }
[[nodiscard]] uint64_t ArraySize() const { return array_size_; }
void BitMask(uint64_t mask) { bit_mask_ = mask; }
[[nodiscard]] uint64_t BitMask() const { return bit_mask_; }
void BitOperation(const A2lBitOperation& operation) {
bit_operation_ = operation;
}
[[nodiscard]] const A2lBitOperation& BitOperation() const {
return bit_operation_;
}
void EcuAddress(uint64_t address) { ecu_address_ = address; }
[[nodiscard]] uint64_t EcuAddress() const { return ecu_address_; }
void ErrorMask(uint64_t mask) { error_mask_ = mask; }
[[nodiscard]] uint64_t ErrorMask() const { return error_mask_; }
void Layout(A2lLayout layout) { layout_ = layout; }
[[nodiscard]] A2lLayout Layout() const { return layout_; }
void ReadWrite(bool read_write) { read_write_ = read_write; }
[[nodiscard]] bool ReadWrite() const { return read_write_; }
void Virtuals(const std::vector<std::string>& list) {
virtual_list_ = list;
}
[[nodiscard]] const std::vector<std::string>& Virtuals() const {
return virtual_list_;
}
private:
A2lDataType data_type_ = A2lDataType::UNKNOWN;
std::string conversion_;
uint64_t resolution_ = 0;
double accuracy_ = 0.0;
double lower_limit_ = 0.0;
double upper_limit_ = 0.0;
A2lAddressType address_type_ = A2lAddressType::UNKNOWN;
uint64_t array_size_ = 0;
uint64_t bit_mask_ = 0;
A2lBitOperation bit_operation_ = {};
uint64_t ecu_address_ = 0;
uint64_t error_mask_ = 0;
A2lLayout layout_ = A2lLayout::UNKNOWN;
bool read_write_ = false;
std::vector<std::string> virtual_list_;
};
using MeasurementList = std::map<std::string, std::unique_ptr<Measurement>>;
}

258
TestLibDlg/IncSourceTestDlg/include/a2l/module.h

@ -0,0 +1,258 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include "a2l/a2lobject.h"
#include "a2l/a2lstructs.h"
#include "a2l/axisdescr.h"
#include "a2l/axispts.h"
#include "a2l/blob.h"
#include "a2l/characteristic.h"
#include "a2l/compumethod.h"
#include "a2l/computab.h"
#include "a2l/compuvtab.h"
#include "a2l/compuvtabrange.h"
#include "a2l/frame.h"
#include "a2l/function.h"
#include "a2l/group.h"
#include "a2l/instance.h"
#include "a2l/measurement.h"
#include "a2l/recordlayout.h"
#include "a2l/transformer.h"
#include "a2l/structure.h"
#include "a2l/unit.h"
namespace a2l {
class Module : public A2lObject {
public:
[[nodiscard]] A2lModCommon& ModCommon() { return mod_common_; }
[[nodiscard]] const A2lModCommon& ModCommon() const { return mod_common_; }
[[nodiscard]] A2lModPar& ModPar() { return mod_par_; }
[[nodiscard]] const A2lModPar& ModPar() const { return mod_par_; }
[[nodiscard]] A2lVariantCoding& VariantCoding() { return variant_coding_; }
[[nodiscard]] const A2lVariantCoding& VariantCoding() const {
return variant_coding_;
}
void A2ml(const std::string& a2ml) { a2ml_ = a2ml; }
[[nodiscard]] const std::string& A2ml() const { return a2ml_;}
void AddAxisPts(std::unique_ptr<AxisPts>& axis_pts);
[[nodiscard]] AxisPtsList& AxisPtss() { return axis_pts_list_; }
[[nodiscard]] const AxisPtsList& AxisPtss() const { return axis_pts_list_; }
[[nodiscard]] AxisPts* GetAxisPts(const std::string& name);
void AddBlob(std::unique_ptr<Blob>& blob);
[[nodiscard]] BlobList& Blobs() { return blob_list_; }
[[nodiscard]] const BlobList& Blobs() const { return blob_list_; }
[[nodiscard]] Blob* GetBlob(const std::string& name);
void AddCharacteristic(std::unique_ptr<Characteristic>& characteristic);
[[nodiscard]] CharacteristicList& Characteristics() {
return characteristic_list_;
}
[[nodiscard]] const CharacteristicList& Characteristics() const {
return characteristic_list_;
}
[[nodiscard]] Characteristic* GetCharacteristic(const std::string& name);
void AddCompuMethod(std::unique_ptr<CompuMethod>& method);
[[nodiscard]] CompuMethodList& CompuMethods() {
return compu_method_list_;
}
[[nodiscard]] const CompuMethodList& CompuMethods() const {
return compu_method_list_;
}
void AddCompuTab(std::unique_ptr<CompuTab>& tab);
[[nodiscard]] CompuTabList& CompuTabs() {
return compu_tab_list_;
}
[[nodiscard]] const CompuTabList& CompuTabs() const {
return compu_tab_list_;
}
[[nodiscard]] CompuTab* GetCompuTab(const std::string& name);
void AddCompuVtab(std::unique_ptr<CompuVtab>& tab);
[[nodiscard]] CompuVtabList& CompuVtabs() {
return compu_vtab_list_;
}
[[nodiscard]] const CompuVtabList& CompuVtabs() const {
return compu_vtab_list_;
}
[[nodiscard]] CompuVtab* GetCompuVtab(const std::string& name);
void AddCompuVtabRange(std::unique_ptr<CompuVtabRange>& tab);
[[nodiscard]] CompuVtabRangeList& CompuVtabRanges() {
return compu_vtab_range_list_;
}
[[nodiscard]] const CompuVtabRangeList& CompuVtabRanges() const {
return compu_vtab_range_list_;
}
[[nodiscard]] CompuVtabRange* GetCompuVtabRange(const std::string& name);
void AddControllerAddress(A2lControllerAddress controller_address) {
controller_address_list_.emplace_back(controller_address);
}
[[nodiscard]] ControllerAddressList& ControllerAddresses() {
return controller_address_list_;
}
[[nodiscard]] const ControllerAddressList& ControllerAddresses() const {
return controller_address_list_;
}
void AddFrame(std::unique_ptr<Frame>& frame);
[[nodiscard]] FrameList& Frames() {
return frame_list_;
}
[[nodiscard]] const FrameList& Frames() const {
return frame_list_;
}
void AddFunction(std::unique_ptr<Function>& func);
[[nodiscard]] FuncList& Functions() {
return function_list_;
}
[[nodiscard]] const FuncList& Functions() const {
return function_list_;
}
void AddGroup(std::unique_ptr<Group>& group);
[[nodiscard]] GroupList& Groups() {
return group_list_;
}
[[nodiscard]] const GroupList& Groups() const {
return group_list_;
}
void AddInstance(std::unique_ptr<Instance>& instance);
[[nodiscard]] InstanceList& Instances() {
return instance_list_;
}
[[nodiscard]] const InstanceList& Instances() const {
return instance_list_;
}
void AddMeasurement(std::unique_ptr<Measurement>& measurement);
[[nodiscard]] MeasurementList& Measurements() {
return measurement_list_;
}
[[nodiscard]] const MeasurementList& Measurements() const {
return measurement_list_;
}
[[nodiscard]] Measurement* GetMeasurement(const std::string& name);
void AddRecordLayout(std::unique_ptr<RecordLayout>& record_layout);
[[nodiscard]] RecordLayoutList& RecordLayouts() {
return record_layout_list_;
}
[[nodiscard]] const RecordLayoutList& RecordLayouts() const {
return record_layout_list_;
}
void AddTransformer(std::unique_ptr<Transformer>& transformer);
[[nodiscard]] TransformerList& Transformers() {
return transformer_list_;
}
[[nodiscard]] const TransformerList& Transformers() const {
return transformer_list_;
}
void AddTypedefAxis(std::unique_ptr<AxisPts>& axis);
[[nodiscard]] AxisPtsList& TypedefAxiss() { return typedef_axis_list_; }
[[nodiscard]] const AxisPtsList& TypedefAxiss() const {
return typedef_axis_list_;
}
[[nodiscard]] AxisPts* GetTypedefAxis(const std::string& name);
void AddTypedefBlob(std::unique_ptr<Blob>& blob);
[[nodiscard]] BlobList& TypedefBlobs() {
return typedef_blob_list_;
}
[[nodiscard]] const BlobList& TypedefBlobs() const {
return typedef_blob_list_;
}
[[nodiscard]] Blob* GetTypedefBlob(const std::string& name);
void AddTypedefCharacteristic(std::unique_ptr<Characteristic>&
characteristic);
[[nodiscard]] CharacteristicList& TypedefCharacteristics() {
return typedef_characteristic_list_;
}
[[nodiscard]] const CharacteristicList& TypedefCharacteristics() const {
return typedef_characteristic_list_;
}
[[nodiscard]] Characteristic* GetTypedefCharacteristic(const std::string&
name);
void AddTypedefMeasurement(std::unique_ptr<Measurement>& measurement);
[[nodiscard]] const MeasurementList& TypedefMeasurements() const {
return typedef_measurement_list_;
}
[[nodiscard]] MeasurementList& TypedefMeasurements() {
return typedef_measurement_list_;
}
[[nodiscard]] Measurement* GetTypedefMeasurement(const std::string& name);
void AddTypedefStructure(std::unique_ptr<Structure>& structure);
[[nodiscard]] StructureList& TypedefStructures() {
return typedef_structure_list_;
}
[[nodiscard]] const StructureList& TypedefStructures() const {
return typedef_structure_list_;
}
[[nodiscard]] Structure* GetTypedefStructure(const std::string& name);
void AddUnit(std::unique_ptr<Unit>& unit);
[[nodiscard]] UnitList& Units() {
return unit_list_;
}
[[nodiscard]] const UnitList& Units() const {
return unit_list_;
}
void AddUserRight(std::unique_ptr<A2lUserRight>& user_right);
[[nodiscard]] UserRightList& UserRights() {
return user_right_list_;
}
[[nodiscard]] const UserRightList& UserRights() const {
return user_right_list_;
}
private:
A2lModCommon mod_common_ = {};
A2lModPar mod_par_ = {};
A2lVariantCoding variant_coding_ = {};
std::string a2ml_;
AxisPtsList axis_pts_list_;
BlobList blob_list_;
CharacteristicList characteristic_list_;
CompuMethodList compu_method_list_;
CompuTabList compu_tab_list_;
CompuVtabList compu_vtab_list_;
CompuVtabRangeList compu_vtab_range_list_;
ControllerAddressList controller_address_list_;
FrameList frame_list_;
FuncList function_list_;
GroupList group_list_;
InstanceList instance_list_;
MeasurementList measurement_list_;
RecordLayoutList record_layout_list_;
TransformerList transformer_list_;
AxisPtsList typedef_axis_list_;
BlobList typedef_blob_list_;
CharacteristicList typedef_characteristic_list_;
MeasurementList typedef_measurement_list_;
StructureList typedef_structure_list_;
UnitList unit_list_;
UserRightList user_right_list_;
};
} // namespace a2l

53
TestLibDlg/IncSourceTestDlg/include/a2l/overwrite.h

@ -0,0 +1,53 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <memory>
#include <cstdint>
#include <string>
#include <vector>
#include "a2l/a2lobject.h"
namespace a2l {
class Overwrite : public A2lObject {
public:
void AxisNo(uint64_t axis) { axis_no_ = axis; }
[[nodiscard]] uint64_t AxisNo() const { return axis_no_; }
void Conversion(const std::string& conversion) { conversion_ = conversion; }
[[nodiscard]] const std::string& Conversion() const { return conversion_; }
void InputQuantity(const std::string& quantity) {
input_quantity_ = quantity;
}
[[nodiscard]] const std::string& InputQuantity() const {
return input_quantity_;
}
void LowerLimit(double limit) { lower_limit_ = limit; }
[[nodiscard]] double LowerLimit() const { return lower_limit_; }
void UpperLimit(double limit) { upper_limit_ = limit; }
[[nodiscard]] double UpperLimit() const { return upper_limit_; }
void Monotony(A2lMonotony monotony) { monotony_ = monotony; }
[[nodiscard]] A2lMonotony Monotony() const { return monotony_; }
private:
uint64_t axis_no_ = 0;
std::string conversion_;
std::string input_quantity_;
double lower_limit_ = 0.0;
double upper_limit_ = 0.0;
A2lMonotony monotony_ = A2lMonotony::UNKNOWN;
};
using OverwriteList = std::vector<std::unique_ptr<Overwrite>>;
} // end namespace a2l

269
TestLibDlg/IncSourceTestDlg/include/a2l/recordlayout.h

@ -0,0 +1,269 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <map>
#include <memory>
#include <string>
#include <vector>
#include <cstdint>
#include "a2l/a2lobject.h"
namespace a2l {
class RecordLayout : public A2lObject {
public:
void AlignmentByte(uint64_t alignment) { alignment_byte_ = alignment; }
[[nodiscard]] uint64_t AlignmentByte() const { return alignment_byte_; }
void AlignmentWord(uint64_t alignment) { alignment_word_ = alignment; }
[[nodiscard]] uint64_t AlignmentWord() const { return alignment_word_; }
void AlignmentLong(uint64_t alignment) { alignment_long_ = alignment; }
[[nodiscard]] uint64_t AlignmentLong() const { return alignment_long_; }
void AlignmentInt64(uint64_t alignment) { alignment_int64_ = alignment; }
[[nodiscard]] uint64_t AlignmentInt64() const { return alignment_int64_; }
void AlignmentFloat16(uint64_t alignment) { alignment_float16_ = alignment; }
[[nodiscard]] uint64_t AlignmentFloat16() const { return alignment_float16_; }
void AlignmentFloat32(uint64_t alignment) { alignment_float32_ = alignment; }
[[nodiscard]] uint64_t AlignmentFloat32() const { return alignment_float32_; }
void AlignmentFloat64(uint64_t alignment) { alignment_float64_ = alignment; }
[[nodiscard]] uint64_t AlignmentFloat64() const { return alignment_float64_; }
void AxisPtsX(const A2lAxisPts& pts) { axis_pts_x_ = pts; }
[[nodiscard]] const A2lAxisPts& AxisPtsX() const { return axis_pts_x_; }
void AxisPtsY(const A2lAxisPts& pts) { axis_pts_y_ = pts; }
[[nodiscard]] const A2lAxisPts& AxisPtsY() const { return axis_pts_y_; }
void AxisPtsZ(const A2lAxisPts& pts) { axis_pts_z_ = pts; }
[[nodiscard]] const A2lAxisPts& AxisPtsZ() const { return axis_pts_z_; }
void AxisPts4(const A2lAxisPts& pts) { axis_pts_4_ = pts; }
[[nodiscard]] const A2lAxisPts& AxisPts4() const { return axis_pts_4_; }
void AxisPts5(const A2lAxisPts& pts) { axis_pts_5_ = pts; }
[[nodiscard]] const A2lAxisPts& AxisPts5() const { return axis_pts_5_; }
void AxisRescaleX(const A2lAxisRescale& scale) { axis_rescale_x_ = scale; }
[[nodiscard]] const A2lAxisRescale& AxisRescaleX() const {
return axis_rescale_x_;
}
void DistOpX(const A2lDistOp& dist) { dist_op_x_ = dist; }
[[nodiscard]] const A2lDistOp& DistOpX() const { return dist_op_x_; }
void DistOpY(const A2lDistOp& dist) { dist_op_y_ = dist; }
[[nodiscard]] const A2lDistOp& DistOpY() const { return dist_op_y_; }
void DistOpZ(const A2lDistOp& dist) { dist_op_z_ = dist; }
[[nodiscard]] const A2lDistOp& DistOpZ() const { return dist_op_z_; }
void DistOp4(const A2lDistOp& dist) { dist_op_4_ = dist; }
[[nodiscard]] const A2lDistOp& DistOp4() const { return dist_op_4_; }
void DistOp5(const A2lDistOp& dist) { dist_op_5_ = dist; }
[[nodiscard]] const A2lDistOp& DistOp5() const { return dist_op_5_; }
void FixNoAxisPtsX(uint64_t pts) { fix_no_axis_pts_x_ = pts; }
[[nodiscard]] uint64_t FixNoAxisPtsX() const { return fix_no_axis_pts_x_; }
void FixNoAxisPtsY(uint64_t pts) { fix_no_axis_pts_y_ = pts; }
[[nodiscard]] uint64_t FixNoAxisPtsY() const { return fix_no_axis_pts_y_; }
void FixNoAxisPtsZ(uint64_t pts) { fix_no_axis_pts_z_ = pts; }
[[nodiscard]] uint64_t FixNoAxisPtsZ() const { return fix_no_axis_pts_z_; }
void FixNoAxisPts4(uint64_t pts) { fix_no_axis_pts_4_ = pts; }
[[nodiscard]] uint64_t FixNoAxisPts4() const { return fix_no_axis_pts_4_; }
void FixNoAxisPts5(uint64_t pts) { fix_no_axis_pts_5_ = pts; }
[[nodiscard]] uint64_t FixNoAxisPts5() const { return fix_no_axis_pts_5_; }
void FncValues(const A2lFncValue& fnc ) { fnc_values_ = fnc; }
[[nodiscard]] const A2lFncValue& FncValues() const { return fnc_values_; }
void Identification(const A2lIdentification& ident ) {
identification_ = ident;
}
[[nodiscard]] const A2lIdentification& Identification() const {
return identification_;
}
void NoAxisPtsX(const A2lDistOp& pts) { no_axis_pts_x_ = pts; }
[[nodiscard]] const A2lDistOp& NoAxisPtsX() const { return no_axis_pts_x_; }
void NoAxisPtsY(const A2lDistOp& pts) { no_axis_pts_y_ = pts; }
[[nodiscard]] const A2lDistOp& NoAxisPtsY() const { return no_axis_pts_y_; }
void NoAxisPtsZ(const A2lDistOp& pts) { no_axis_pts_z_ = pts; }
[[nodiscard]] const A2lDistOp& NoAxisPtsZ() const { return no_axis_pts_z_; }
void NoAxisPts4(const A2lDistOp& pts) { no_axis_pts_4_ = pts; }
[[nodiscard]] const A2lDistOp& NoAxisPts4() const { return no_axis_pts_4_; }
void NoAxisPts5(const A2lDistOp& pts) { no_axis_pts_5_ = pts; }
[[nodiscard]] const A2lDistOp& NoAxisPts5() const { return no_axis_pts_5_; }
void NoRescaleX(const A2lDistOp& pts) { no_rescale_x_ = pts; }
[[nodiscard]] const A2lDistOp& NoRescaleX() const { return no_rescale_x_; }
void OffsetX(const A2lDistOp& offset) { offset_x_ = offset; }
[[nodiscard]] const A2lDistOp& OffsetX() const { return offset_x_; }
void OffsetY(const A2lDistOp& offset) { offset_y_ = offset; }
[[nodiscard]] const A2lDistOp& OffsetY() const { return offset_y_; }
void OffsetZ(const A2lDistOp& offset) { offset_z_ = offset; }
[[nodiscard]] const A2lDistOp& OffsetZ() const { return offset_z_; }
void Offset4(const A2lDistOp& offset) { offset_4_ = offset; }
[[nodiscard]] const A2lDistOp& Offset4() const { return offset_4_; }
void Offset5(const A2lDistOp& offset) { offset_5_ = offset; }
[[nodiscard]] const A2lDistOp& Offset5() const { return offset_5_; }
void AddReserved(const A2lDistOp& reserved);
[[nodiscard]] const std::vector<A2lDistOp>& ReservedList() const {
return reserved_list_;
}
void RipAddrW(const A2lDistOp& rip) { rip_addr_w_ = rip; }
[[nodiscard]] const A2lDistOp& RipAddrW() const { return rip_addr_w_; }
void RipAddrX(const A2lDistOp& rip) { rip_addr_x_ = rip; }
[[nodiscard]] const A2lDistOp& RipAddrX() const { return rip_addr_x_; }
void RipAddrY(const A2lDistOp& rip) { rip_addr_y_ = rip; }
[[nodiscard]] const A2lDistOp& RipAddrY() const { return rip_addr_y_; }
void RipAddrZ(const A2lDistOp& rip) { rip_addr_z_ = rip; }
[[nodiscard]] const A2lDistOp& RipAddrZ() const { return rip_addr_z_; }
void RipAddr4(const A2lDistOp& rip) { rip_addr_4_ = rip; }
[[nodiscard]] const A2lDistOp& RipAddr4() const { return rip_addr_4_; }
void RipAddr5(const A2lDistOp& rip) { rip_addr_5_ = rip; }
[[nodiscard]] const A2lDistOp& RipAddr5() const { return rip_addr_5_; }
void SrcAddrX(const A2lDistOp& src) { src_addr_x_ = src; }
[[nodiscard]] const A2lDistOp& SrcAddrX() const { return src_addr_x_; }
void SrcAddrY(const A2lDistOp& src) { src_addr_y_ = src; }
[[nodiscard]] const A2lDistOp& SrcAddrY() const { return src_addr_y_; }
void SrcAddrZ(const A2lDistOp& src) { src_addr_z_ = src; }
[[nodiscard]] const A2lDistOp& SrcAddrZ() const { return src_addr_z_; }
void SrcAddr4(const A2lDistOp& src) { src_addr_4_ = src; }
[[nodiscard]] const A2lDistOp& SrcAddr4() const { return src_addr_4_; }
void SrcAddr5(const A2lDistOp& src) { src_addr_5_ = src; }
[[nodiscard]] const A2lDistOp& SrcAddr5() const { return src_addr_5_; }
void ShiftOpX(const A2lDistOp& shift) { shift_op_x_ = shift; }
[[nodiscard]] const A2lDistOp& ShiftOpX() const { return shift_op_x_; }
void ShiftOpY(const A2lDistOp& shift) { shift_op_y_ = shift; }
[[nodiscard]] const A2lDistOp& ShiftOpY() const { return shift_op_y_; }
void ShiftOpZ(const A2lDistOp& shift) { shift_op_z_ = shift; }
[[nodiscard]] const A2lDistOp& ShiftOpZ() const { return shift_op_z_; }
void ShiftOp4(const A2lDistOp& shift) { shift_op_4_ = shift; }
[[nodiscard]] const A2lDistOp& ShiftOp4() const { return shift_op_4_; }
void ShiftOp5(const A2lDistOp& shift) { shift_op_5_ = shift; }
[[nodiscard]] const A2lDistOp& ShiftOp5() const { return shift_op_5_; }
void StaticAddressOffsets(bool offset) { static_address_offsets_ = offset; }
[[nodiscard]] bool StaticAddressOffsets() const {
return static_address_offsets_;
}
void StaticRecordLayout(bool layout) { static_record_layout_ = layout; }
[[nodiscard]] bool StaticRecordLayout() const {
return static_record_layout_;
}
private:
uint64_t alignment_byte_ = 0;
uint64_t alignment_word_ = 0;
uint64_t alignment_long_ = 0;
uint64_t alignment_int64_ = 0;
uint64_t alignment_float16_ = 0;
uint64_t alignment_float32_ = 0;
uint64_t alignment_float64_ = 0;
A2lAxisPts axis_pts_x_ = {};
A2lAxisPts axis_pts_y_ = {};
A2lAxisPts axis_pts_z_ = {};
A2lAxisPts axis_pts_4_ = {};
A2lAxisPts axis_pts_5_ = {};
A2lAxisRescale axis_rescale_x_ = {};
A2lDistOp dist_op_x_ = {};
A2lDistOp dist_op_y_ = {};
A2lDistOp dist_op_z_ = {};
A2lDistOp dist_op_4_ = {};
A2lDistOp dist_op_5_ = {};
uint64_t fix_no_axis_pts_x_ = 0;
uint64_t fix_no_axis_pts_y_ = 0;
uint64_t fix_no_axis_pts_z_ = 0;
uint64_t fix_no_axis_pts_4_ = 0;
uint64_t fix_no_axis_pts_5_ = 0;
A2lFncValue fnc_values_ = {};
A2lIdentification identification_ = {};
A2lDistOp no_axis_pts_x_ = {};
A2lDistOp no_axis_pts_y_ = {};
A2lDistOp no_axis_pts_z_ = {};
A2lDistOp no_axis_pts_4_ = {};
A2lDistOp no_axis_pts_5_ = {};
A2lDistOp no_rescale_x_ = {};
A2lDistOp offset_x_ = {};
A2lDistOp offset_y_ = {};
A2lDistOp offset_z_ = {};
A2lDistOp offset_4_ = {};
A2lDistOp offset_5_ = {};
std::vector<A2lDistOp> reserved_list_;
A2lDistOp rip_addr_w_ = {};
A2lDistOp rip_addr_x_ = {};
A2lDistOp rip_addr_y_ = {};
A2lDistOp rip_addr_z_ = {};
A2lDistOp rip_addr_4_ = {};
A2lDistOp rip_addr_5_ = {};
A2lDistOp src_addr_x_ = {};
A2lDistOp src_addr_y_ = {};
A2lDistOp src_addr_z_ = {};
A2lDistOp src_addr_4_ = {};
A2lDistOp src_addr_5_ = {};
A2lDistOp shift_op_x_ = {};
A2lDistOp shift_op_y_ = {};
A2lDistOp shift_op_z_ = {};
A2lDistOp shift_op_4_ = {};
A2lDistOp shift_op_5_ = {};
bool static_address_offsets_ = false;
bool static_record_layout_ = false;
};
using RecordLayoutList = std::map<std::string, std::unique_ptr<RecordLayout>>;
} // end namespace a2l

51
TestLibDlg/IncSourceTestDlg/include/a2l/structure.h

@ -0,0 +1,51 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <map>
#include <memory>
#include <string>
#include <cstdint>
#include <utility>
#include "a2l/a2lobject.h"
#include "a2l/a2lstructs.h"
namespace a2l {
class Structure : public A2lObject {
public:
void Size(uint64_t size) { size_ = size; }
[[nodiscard]] uint64_t Size() const { return size_; }
void AddressType(A2lAddressType type) { address_type_ = type; }
[[nodiscard]] A2lAddressType AddressType() const { return address_type_; }
void ConsistentExchange(bool value) { consistent_exchange_ = value; }
[[nodiscard]] bool ConsistentExchange() const { return consistent_exchange_; }
void AddStructureComponent(std::unique_ptr<A2lStructureComponent>&
component) {
structure_component_list_.emplace(component->Name, std::move(component));
}
[[nodiscard]] const StructureComponentList& StructureComponents() const {
return structure_component_list_;
}
void SymbolTypeLink(const std::string& link) { symbol_type_link_ = link; }
[[nodiscard]] const std::string& SymbolTypeLink() const {
return symbol_type_link_; }
private:
uint64_t size_ = 0;
A2lAddressType address_type_ = A2lAddressType::DIRECT;
bool consistent_exchange_ = false;
StructureComponentList structure_component_list_;
std::string symbol_type_link_;
};
using StructureList = std::map<std::string, std::unique_ptr<Structure>>;
} // end namespace

70
TestLibDlg/IncSourceTestDlg/include/a2l/transformer.h

@ -0,0 +1,70 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <map>
#include <memory>
#include <string>
#include <cstdint>
#include <vector>
#include "a2l/a2lobject.h"
namespace a2l {
class Transformer : public A2lObject {
public:
void Version(const std::string& version) { version_ = version; }
[[nodiscard]] const std::string& Version() const {return version_; }
void Executable32(const std::string& exe) { executable32_ = exe; }
[[nodiscard]] const std::string& Executable32() const {return executable32_; }
void Executable64(const std::string& exe) { executable64_ = exe; }
[[nodiscard]] const std::string& Executable64() const {return executable64_; }
void Timeout(uint64_t timeout) { timeout_ = timeout; }
[[nodiscard]] uint64_t Timeout() const {return timeout_; }
void Trigger(A2lTrigger trigger) { trigger_ = trigger; }
[[nodiscard]] A2lTrigger Trigger() const { return trigger_; }
void InverseTransformer(const std::string& inverse) {
inverse_transformer_ = inverse;
}
[[nodiscard]] const std::string& InverseTransformer() const {
return inverse_transformer_;
}
void TransformerInObjects(const std::vector<std::string>& list) {
in_object_list_ = list;
}
[[nodiscard]] const std::vector<std::string>& TransformerInObjects() const {
return in_object_list_;
}
void TransformerOutObjects(const std::vector<std::string>& list) {
out_object_list_ = list;
}
[[nodiscard]] const std::vector<std::string>& TransformerOutObjects() const {
return out_object_list_;
}
private:
std::string version_;
std::string executable32_;
std::string executable64_;
uint64_t timeout_ = 0;
A2lTrigger trigger_ = A2lTrigger::UNKNOWN;
std::string inverse_transformer_;
std::vector<std::string> in_object_list_;
std::vector<std::string> out_object_list_;
};
using TransformerList = std::map<std::string, std::unique_ptr<Transformer>>;
} // end namespace a2l

48
TestLibDlg/IncSourceTestDlg/include/a2l/unit.h

@ -0,0 +1,48 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <map>
#include <memory>
#include <string>
#include "a2l/a2lobject.h"
namespace a2l {
class Unit : public A2lObject {
public:
void Type(A2lUnitType type) { type_ = type; }
[[nodiscard]] A2lUnitType Type() const { return type_; }
void RefUnit(const std::string& ref) { ref_unit_ = ref; }
[[nodiscard]] const std::string& RefUnit() const { return ref_unit_; }
void SiExponents(const A2lSiExponents& exponents) {
si_exponents_ = exponents;
}
[[nodiscard]] const A2lSiExponents& SiExponents() const {
return si_exponents_;
}
void Gradient(double gradient) { gradient_ = gradient; }
[[nodiscard]] double Gradient() const { return gradient_; }
void Offset(double offset) { offset_ = offset; }
[[nodiscard]] double Offset() const { return offset_; }
private:
A2lUnitType type_ = A2lUnitType::UNKNOWN;
std::string ref_unit_;
A2lSiExponents si_exponents_ = {};
double gradient_ = 0.0;
double offset_ = 0.0;
};
using UnitList = std::map<std::string, std::unique_ptr<Unit>>;
} // end namespace a2l

5
TestLibDlg/IncSourceTestDlg/pch.cpp

@ -0,0 +1,5 @@
// pch.cpp: 미리 컴파일된 헤더에 해당하는 소스 파일
#include "pch.h"
// 미리 컴파일된 헤더를 사용하는 경우 컴파일이 성공하려면 이 소스 파일이 필요합니다.

13
TestLibDlg/IncSourceTestDlg/pch.h

@ -0,0 +1,13 @@
// pch.h: 미리 컴파일된 헤더 파일입니다.
// 아래 나열된 파일은 한 번만 컴파일되었으며, 향후 빌드에 대한 빌드 성능을 향상합니다.
// 코드 컴파일 및 여러 코드 검색 기능을 포함하여 IntelliSense 성능에도 영향을 미칩니다.
// 그러나 여기에 나열된 파일은 빌드 간 업데이트되는 경우 모두 다시 컴파일됩니다.
// 여기에 자주 업데이트할 파일을 추가하지 마세요. 그러면 성능이 저하됩니다.
#ifndef PCH_H
#define PCH_H
// 여기에 미리 컴파일하려는 헤더 추가
#include "framework.h"
#endif //PCH_H

BIN
TestLibDlg/IncSourceTestDlg/res/IncSourceTestDlg.ico

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
TestLibDlg/IncSourceTestDlg/res/IncSourceTestDlg.rc2

Binary file not shown.

23
TestLibDlg/IncSourceTestDlg/resource.h

@ -0,0 +1,23 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++에서 생성한 포함 파일입니다.
// IncSourceTestDlg.rc에서 사용되고 있습니다.
//
#define IDM_ABOUTBOX 0x0010
#define IDD_ABOUTBOX 100
#define IDP_OLE_INIT_FAILED 100
#define IDS_ABOUTBOX 101
#define IDD_INCSOURCETESTDLG_DIALOG 102
#define IDR_MAINFRAME 128
#define IDC_LIST_DATA 1001
#define IDC_BUTTON_OPEN 1002
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 130
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

220
TestLibDlg/IncSourceTestDlg/src/FlexLexer.h

@ -0,0 +1,220 @@
// -*-C++-*-
// FlexLexer.h -- define interfaces for lexical analyzer classes generated
// by flex
// Copyright (c) 1993 The Regents of the University of California.
// All rights reserved.
//
// This code is derived from software contributed to Berkeley by
// Kent Williams and Tom Epperly.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// Neither the name of the University nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE.
// This file defines FlexLexer, an abstract class which specifies the
// external interface provided to flex C++ lexer objects, and yyFlexLexer,
// which defines a particular lexer class.
//
// If you want to create multiple lexer classes, you use the -P flag
// to rename each yyFlexLexer to some other xxFlexLexer. You then
// include <FlexLexer.h> in your other sources once per lexer class:
//
// #undef yyFlexLexer
// #define yyFlexLexer xxFlexLexer
// #include <FlexLexer.h>
//
// #undef yyFlexLexer
// #define yyFlexLexer zzFlexLexer
// #include <FlexLexer.h>
// ...
#ifndef __FLEX_LEXER_H
// Never included before - need to define base class.
#define __FLEX_LEXER_H
#include <iostream>
extern "C++" {
struct yy_buffer_state;
typedef int yy_state_type;
class FlexLexer
{
public:
virtual ~FlexLexer() { }
const char* YYText() const { return yytext; }
int YYLeng() const { return yyleng; }
virtual void
yy_switch_to_buffer( yy_buffer_state* new_buffer ) = 0;
virtual yy_buffer_state* yy_create_buffer( std::istream* s, int size ) = 0;
virtual yy_buffer_state* yy_create_buffer( std::istream& s, int size ) = 0;
virtual void yy_delete_buffer( yy_buffer_state* b ) = 0;
virtual void yyrestart( std::istream* s ) = 0;
virtual void yyrestart( std::istream& s ) = 0;
virtual int yylex() = 0;
// Call yylex with new input/output sources.
int yylex( std::istream& new_in, std::ostream& new_out )
{
switch_streams( new_in, new_out );
return yylex();
}
int yylex( std::istream* new_in, std::ostream* new_out = 0)
{
switch_streams( new_in, new_out );
return yylex();
}
// Switch to new input/output streams. A nil stream pointer
// indicates "keep the current one".
virtual void switch_streams( std::istream* new_in,
std::ostream* new_out ) = 0;
virtual void switch_streams( std::istream& new_in,
std::ostream& new_out ) = 0;
int lineno() const { return yylineno; }
int debug() const { return yy_flex_debug; }
void set_debug( int flag ) { yy_flex_debug = flag; }
protected:
char* yytext;
int yyleng;
int yylineno; // only maintained if you use %option yylineno
int yy_flex_debug; // only has effect with -d or "%option debug"
};
}
#endif // FLEXLEXER_H
#if defined(yyFlexLexer) || ! defined(yyFlexLexerOnce)
// Either this is the first time through (yyFlexLexerOnce not defined),
// or this is a repeated include to define a different flavor of
// yyFlexLexer, as discussed in the flex manual.
# define yyFlexLexerOnce
extern "C++" {
class yyFlexLexer : public FlexLexer {
public:
// arg_yyin and arg_yyout default to the cin and cout, but we
// only make that assignment when initializing in yylex().
yyFlexLexer( std::istream& arg_yyin, std::ostream& arg_yyout );
yyFlexLexer( std::istream* arg_yyin = 0, std::ostream* arg_yyout = 0 );
private:
void ctor_common();
public:
virtual ~yyFlexLexer();
void yy_switch_to_buffer( yy_buffer_state* new_buffer );
yy_buffer_state* yy_create_buffer( std::istream* s, int size );
yy_buffer_state* yy_create_buffer( std::istream& s, int size );
void yy_delete_buffer( yy_buffer_state* b );
void yyrestart( std::istream* s );
void yyrestart( std::istream& s );
void yypush_buffer_state( yy_buffer_state* new_buffer );
void yypop_buffer_state();
virtual int yylex();
virtual void switch_streams( std::istream& new_in, std::ostream& new_out );
virtual void switch_streams( std::istream* new_in = 0, std::ostream* new_out = 0 );
virtual int yywrap();
protected:
virtual int LexerInput( char* buf, int max_size );
virtual void LexerOutput( const char* buf, int size );
virtual void LexerError( const char* msg );
void yyunput( int c, char* buf_ptr );
int yyinput();
void yy_load_buffer_state();
void yy_init_buffer( yy_buffer_state* b, std::istream& s );
void yy_flush_buffer( yy_buffer_state* b );
int yy_start_stack_ptr;
int yy_start_stack_depth;
int* yy_start_stack;
void yy_push_state( int new_state );
void yy_pop_state();
int yy_top_state();
yy_state_type yy_get_previous_state();
yy_state_type yy_try_NUL_trans( yy_state_type current_state );
int yy_get_next_buffer();
std::istream yyin; // input source for default LexerInput
std::ostream yyout; // output sink for default LexerOutput
// yy_hold_char holds the character lost when yytext is formed.
char yy_hold_char;
// Number of characters read into yy_ch_buf.
int yy_n_chars;
// Points to current character in buffer.
char* yy_c_buf_p;
int yy_init; // whether we need to initialize
int yy_start; // start state number
// Flag which is used to allow yywrap()'s to do buffer switches
// instead of setting up a fresh yyin. A bit of a hack ...
int yy_did_buffer_switch_on_eof;
size_t yy_buffer_stack_top; /**< index of top of stack. */
size_t yy_buffer_stack_max; /**< capacity of stack. */
yy_buffer_state ** yy_buffer_stack; /**< Stack as an array. */
void yyensure_buffer_stack(void);
// The following are not always needed, but may be depending
// on use of certain flex features (like REJECT or yymore()).
yy_state_type yy_last_accepting_state;
char* yy_last_accepting_cpos;
yy_state_type* yy_state_buf;
yy_state_type* yy_state_ptr;
char* yy_full_match;
int* yy_full_state;
int yy_full_lp;
int yy_lp;
int yy_looking_for_trail_begin;
int yy_more_flag;
int yy_more_len;
int yy_more_offset;
int yy_prev_more_offset;
};
}
#endif // yyFlexLexer || ! yyFlexLexerOnce

496
TestLibDlg/IncSourceTestDlg/src/a2lenums.cpp

@ -0,0 +1,496 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/a2lenums.h"
#include <array>
namespace {
template <typename T, size_t S>
T StringToEnum(const std::string& text,
const std::array<std::pair<std::string_view, T>, S>& list) {
auto type = T::UNKNOWN;
for (const auto& [idx_text, idx_type] : list) {
if (idx_text == text) {
type = idx_type;
break;
}
}
return type;
}
template <typename T, size_t S>
std::string_view EnumToString(T type,
const std::array<std::pair<std::string_view, T>, S>& list) {
for (const auto& [idx_text, idx_type] : list) {
if (idx_type == type) {
return idx_text;
}
}
return "UNKNOWN";
}
template <typename T, size_t S>
a2l::EnumStringList EnumToStringList(
const std::array<std::pair<std::string_view, T>, S>& list) {
a2l::EnumStringList enum_list;
const auto end_type = T::UNKNOWN;
for (const auto& [idx_text, idx_type] : list) {
if (idx_type == end_type) {
break;
}
enum_list.emplace_back(idx_text);
}
return enum_list;
}
} // end namespace
namespace a2l {
/*------------- ADDRESS TYPE ---------------------------*/
using StringAddressType = std::pair<std::string_view, A2lAddressType>;
constexpr std::array<StringAddressType , 5> kAddressTypeList = {
StringAddressType("PBYTE", A2lAddressType::PBYTE),
StringAddressType("PWORD", A2lAddressType::PWORD),
StringAddressType("PLONG", A2lAddressType::PLONG),
StringAddressType("PLONGLONG", A2lAddressType::PLONGLONG),
StringAddressType("DIRECT", A2lAddressType::DIRECT)
};
A2lAddressType StringToAddressType(const std::string& text) {
return StringToEnum<A2lAddressType, 5>(text, kAddressTypeList);
}
std::string_view AddressTypeToString(A2lAddressType type) {
return EnumToString<A2lAddressType, 5>(type, kAddressTypeList);
}
EnumStringList AddressTypeToStringList() {
return EnumToStringList<A2lAddressType,5>(kAddressTypeList);
}
/* ----------------AXIS TYPE ------------------------*/
using StringAxisType = std::pair<std::string_view, A2lAxisType>;
constexpr std::array<StringAxisType , 5> kAxisTypeList = {
StringAxisType("CURVE_AXIS", A2lAxisType::CURVE_AXIS),
StringAxisType("COM_AXIS", A2lAxisType::COM_AXIS),
StringAxisType("FIX_AXIS", A2lAxisType::FIX_AXIS),
StringAxisType("RES_AXIS", A2lAxisType::RES_AXIS),
StringAxisType("STD_AXIS", A2lAxisType::STD_AXIS)
};
A2lAxisType StringToAxisType(const std::string& text) {
return StringToEnum<A2lAxisType, 5>(text, kAxisTypeList);
}
std::string_view AxisTypeToString(A2lAxisType type) {
return EnumToString<A2lAxisType, 5>(type, kAxisTypeList);
}
EnumStringList AxisTypeToStringList() {
return EnumToStringList<A2lAxisType,5>(kAxisTypeList);
}
/*----------------- BYTE ORDER -------------------------*/
using StringByteOrder = std::pair<std::string_view, A2lByteOrder>;
constexpr std::array<StringByteOrder , 4> kByteOrderList = {
StringByteOrder("MSB_FIRST", A2lByteOrder::MSB_FIRST),
StringByteOrder("MSB_LAST", A2lByteOrder::MSB_LAST),
StringByteOrder("MSB_FIRST_MSW_LAST", A2lByteOrder::MSB_FIRST_MSW_LAST),
StringByteOrder("MSB_LAST_MSW_FIRST", A2lByteOrder::MSB_LAST_MSW_FIRST)
};
A2lByteOrder StringToByteOrder(const std::string& text) {
return StringToEnum<A2lByteOrder,4>(text, kByteOrderList);
}
std::string_view ByteOrderToString(A2lByteOrder type) {
return EnumToString<A2lByteOrder, 4>(type, kByteOrderList);
}
EnumStringList ByteOrderToStringList() {
return EnumToStringList<A2lByteOrder,4>(kByteOrderList);
}
/*--------------- CALIBRATION ACCESS ---------------------*/
using StringCalibrationAccess = std::pair<std::string_view,
A2lCalibrationAccess>;
constexpr std::array<StringCalibrationAccess , 4> kCalibrationAccessList = {
StringCalibrationAccess("CALIBRATION", A2lCalibrationAccess::CALIBRATION),
StringCalibrationAccess("NO_CALIBRATION",
A2lCalibrationAccess::NO_CALIBRATION),
StringCalibrationAccess("NOT_IN_MCD_SYSTEM",
A2lCalibrationAccess::NOT_IN_MCD_SYSTEM),
StringCalibrationAccess("OFFLINE_CALIBRATION",
A2lCalibrationAccess::OFFLINE_CALIBRATION)
};
A2lCalibrationAccess StringToCalibrationAccess(const std::string& text) {
return StringToEnum<A2lCalibrationAccess,4>(text, kCalibrationAccessList);
}
std::string_view CalibrationAccessToString(A2lCalibrationAccess access) {
return EnumToString<A2lCalibrationAccess, 4>(access, kCalibrationAccessList);
}
EnumStringList CalibrationAccessToStringList() {
return EnumToStringList<A2lCalibrationAccess,4>(kCalibrationAccessList);
}
/*----------------- CHARACTERISTIC TYPE -----------------------------*/
using StringCharacteristicType= std::pair<std::string_view,
A2lCharacteristicType>;
constexpr std::array<StringCharacteristicType , 8> kCharacteristicTypeList = {
StringCharacteristicType("ASCII", A2lCharacteristicType::ASCII),
StringCharacteristicType("CURVE", A2lCharacteristicType::CURVE),
StringCharacteristicType("MAP", A2lCharacteristicType::MAP),
StringCharacteristicType("CUBOID", A2lCharacteristicType::CUBOID),
StringCharacteristicType("CUBE_4", A2lCharacteristicType::CUBE_4),
StringCharacteristicType("CUBE_5", A2lCharacteristicType::CUBE_5),
StringCharacteristicType("VAL_BLK", A2lCharacteristicType::VAL_BLK),
StringCharacteristicType("VALUE", A2lCharacteristicType::VALUE),
};
A2lCharacteristicType StringToCharacteristicType(const std::string& text) {
return StringToEnum<A2lCharacteristicType,8>(text, kCharacteristicTypeList);
}
std::string_view CharacteristicTypeToString(A2lCharacteristicType type) {
return EnumToString<A2lCharacteristicType, 8>(type, kCharacteristicTypeList);
}
EnumStringList CharacteristicTypeToStringList() {
return EnumToStringList<A2lCharacteristicType,8>(kCharacteristicTypeList);
}
/*---------------------- CONVERSION TYPE ------------------------*/
using StringConversionType = std::pair<std::string_view,
A2lConversionType>;
constexpr std::array<StringConversionType , 7> kConversionTypeList = {
StringConversionType("IDENTICAL", A2lConversionType::IDENTICAL),
StringConversionType("FORM", A2lConversionType::FORM),
StringConversionType("LINEAR", A2lConversionType::LINEAR),
StringConversionType("RAT_FUNC", A2lConversionType::RAT_FUNC),
StringConversionType("TAB_INP", A2lConversionType::TAB_INP),
StringConversionType("TAB_NOINTP", A2lConversionType::TAB_NOINTP),
StringConversionType("TAB_VERB", A2lConversionType::TAB_VERB),
};
A2lConversionType StringToConversionType(const std::string& text) {
return StringToEnum<A2lConversionType,7>(text, kConversionTypeList);
}
std::string_view ConversionTypeToString(A2lConversionType type) {
return EnumToString<A2lConversionType, 7>(type, kConversionTypeList);
}
EnumStringList ConversionTypeToStringList() {
return EnumToStringList<A2lConversionType,7>(kConversionTypeList);
}
/*-------------- DAtA TYPE --------------------------*/
using StringDataType = std::pair<std::string_view,
A2lDataType>;
constexpr std::array<StringDataType, 11> kDataTypeList = {
StringDataType("UBYTE", A2lDataType::UBYTE),
StringDataType("SBYTE", A2lDataType::SBYTE),
StringDataType("UWORD", A2lDataType::UWORD),
StringDataType("SWORD", A2lDataType::SWORD),
StringDataType("ULONG", A2lDataType::ULONG),
StringDataType("SLONG", A2lDataType::SLONG),
StringDataType("A_UINT64", A2lDataType::A_UINT64),
StringDataType("A_INT64", A2lDataType::A_INT64),
StringDataType("FLOAT16_IEEE", A2lDataType::FLOAT16_IEEE),
StringDataType("FLOAT32_IEEE", A2lDataType::FLOAT32_IEEE),
StringDataType("FLOAT64_IEEE", A2lDataType::FLOAT64_IEEE),
};
A2lDataType StringToDataType(const std::string& text) {
return StringToEnum<A2lDataType,11>(text, kDataTypeList);
}
std::string_view DataTypeToString(A2lDataType type) {
return EnumToString<A2lDataType, 11>(type, kDataTypeList);
}
EnumStringList DataTypeToStringList() {
return EnumToStringList<A2lDataType,11>(kDataTypeList);
}
/*--------------- DEPOSIT ---------------------*/
using StringDeposit = std::pair<std::string_view, A2lDeposit>;
constexpr std::array<StringDeposit , 2> kDepositList = {
StringDeposit("ABSOLUTE", A2lDeposit::A2L_ABSOLUTE),
StringDeposit("DIFFERENCE", A2lDeposit::A2L_DIFFERENCE)
};
A2lDeposit StringToDeposit(const std::string& text) {
return StringToEnum<A2lDeposit,2>(text, kDepositList);
}
std::string_view DepositToString(A2lDeposit deposit) {
return EnumToString<A2lDeposit, 2>(deposit, kDepositList);
}
EnumStringList DepositToStringList() {
return EnumToStringList<A2lDeposit,2>(kDepositList);
}
/*----------------- ENCODING ---------------------------*/
using StringEncoding = std::pair<std::string_view, A2lEncoding>;
constexpr std::array<StringEncoding, 4> kEncodingList = {
StringEncoding("", A2lEncoding::ASCII),
StringEncoding("UTF8", A2lEncoding::UTF8),
StringEncoding("UTF16", A2lEncoding::UTF16),
StringEncoding("UTF32", A2lEncoding::UTF32)
};
A2lEncoding StringToEncoding(const std::string& text) {
return StringToEnum<A2lEncoding,4>(text, kEncodingList);
}
std::string_view EncodingToString(A2lEncoding encoding) {
return EnumToString<A2lEncoding, 4>(encoding, kEncodingList);
}
EnumStringList EncodingToStringList() {
return EnumToStringList<A2lEncoding,4>(kEncodingList);
}
/*----------------------- INDEX MODE --------------------*/
using StringIndexMode = std::pair<std::string_view, A2lIndexMode>;
constexpr std::array<StringIndexMode , 5> kIndexModeList = {
StringIndexMode("ALTERNATE_CURVES", A2lIndexMode::ALTERNATE_CURVES),
StringIndexMode("ALTERNATE_WITH_X", A2lIndexMode::ALTERNATE_WITH_X),
StringIndexMode("ALTERNATE_WITH_Y", A2lIndexMode::ALTERNATE_WITH_Y),
StringIndexMode("COLUMN_DIR", A2lIndexMode::COLUMN_DIR),
StringIndexMode("ROW_DIR", A2lIndexMode::ROW_DIR)
};
A2lIndexMode StringToIndexMode(const std::string& text) {
return StringToEnum<A2lIndexMode,5>(text, kIndexModeList);
}
std::string_view IndexModeToString(A2lIndexMode mode) {
return EnumToString<A2lIndexMode, 5>(mode, kIndexModeList);
}
EnumStringList IndexModeToStringList() {
return EnumToStringList<A2lIndexMode,5>(kIndexModeList);
}
/*----------------- INDEX ORDER --------------------------*/
using StringIndexOrder = std::pair<std::string_view, A2lIndexOrder>;
constexpr std::array<StringIndexOrder , 2> kIndexOrderList = {
StringIndexOrder("INDEX_INCR", A2lIndexOrder::INDEX_INCR),
StringIndexOrder("INDEX_DECR", A2lIndexOrder::INDEX_DECR)
};
A2lIndexOrder StringToIndexOrder(const std::string& text) {
return StringToEnum<A2lIndexOrder,2>(text, kIndexOrderList);
}
std::string_view IndexOrderToString(A2lIndexOrder order) {
return EnumToString<A2lIndexOrder, 2>(order, kIndexOrderList);
}
EnumStringList IndexOrderToStringList() {
return EnumToStringList<A2lIndexOrder,2>(kIndexOrderList);
}
/*------------------ LAYOUT -----------------------------*/
using StringLayout = std::pair<std::string_view, A2lLayout>;
constexpr std::array<StringLayout , 2> kLayoutList = {
StringLayout("ROW_DIR", A2lLayout::ROW_DIR),
StringLayout("COLUMN_DIR", A2lLayout::COLUMN_DIR)
};
A2lLayout StringToLayout(const std::string& text) {
return StringToEnum<A2lLayout,2>(text, kLayoutList);
}
std::string_view LayoutToString(A2lLayout layout) {
return EnumToString<A2lLayout, 2>(layout, kLayoutList);
}
EnumStringList LayoutToStringList() {
return EnumToStringList<A2lLayout,2>(kLayoutList);
}
/*------------------- MEMORY TYPE ------------------------*/
using StringMemoryType = std::pair<std::string_view, A2lMemoryType>;
constexpr std::array<StringMemoryType, 7> kMemoryList = {
StringMemoryType("EEPROM", A2lMemoryType::EEPROM),
StringMemoryType("EPROM", A2lMemoryType::EPROM),
StringMemoryType("FLASH", A2lMemoryType::FLASH),
StringMemoryType("RAM", A2lMemoryType::RAM),
StringMemoryType("ROM", A2lMemoryType::ROM),
StringMemoryType("REGISTER", A2lMemoryType::REGISTER),
StringMemoryType("NOT_IN_ECU", A2lMemoryType::NOT_IN_ECU),
};
A2lMemoryType StringToMemoryType(const std::string& text) {
return StringToEnum<A2lMemoryType,7>(text, kMemoryList);
}
std::string_view MemoryTypeToString(A2lMemoryType type) {
return EnumToString<A2lMemoryType, 7>(type, kMemoryList);
}
EnumStringList MemoryTypeToStringList() {
return EnumToStringList<A2lMemoryType,7>(kMemoryList);
}
/*------------ MEMORY ATTRIBUTE -------------------------*/
using StringMemoryAttribute = std::pair<std::string_view, A2lMemoryAttribute>;
constexpr std::array<StringMemoryAttribute, 2> kAttributeList = {
StringMemoryAttribute("INTERN", A2lMemoryAttribute::INTERN),
StringMemoryAttribute("EXTERN", A2lMemoryAttribute::EXTERN),
};
A2lMemoryAttribute StringToMemoryAttribute(const std::string& text) {
return StringToEnum<A2lMemoryAttribute,2>(text, kAttributeList);
}
std::string_view MemoryAttributeToString(A2lMemoryAttribute attr) {
return EnumToString<A2lMemoryAttribute, 2>(attr, kAttributeList);
}
EnumStringList MemoryAttributeToStringList() {
return EnumToStringList<A2lMemoryAttribute,2>(kAttributeList);
}
/*-------------------------- MONOTONY -------------------------*/
using StringMonotony = std::pair<std::string_view, A2lMonotony>;
constexpr std::array<StringMonotony, 7> kMonotonyList = {
StringMonotony("MON_DECREASE", A2lMonotony::MON_DECREASE),
StringMonotony("MON_INCREASE", A2lMonotony::MON_INCREASE),
StringMonotony("STRICT_DECREASE", A2lMonotony::STRICT_DECREASE),
StringMonotony("STRICT_INCREASE", A2lMonotony::STRICT_INCREASE),
StringMonotony("MONOTONOUS", A2lMonotony::MONOTONOUS),
StringMonotony("STRICT_MON", A2lMonotony::STRICT_MON),
StringMonotony("NOT_MON", A2lMonotony::NOT_MON),
};
A2lMonotony StringToMonotony(const std::string& text) {
return StringToEnum<A2lMonotony,7>(text, kMonotonyList);
}
std::string_view MonotonyToString(A2lMonotony type) {
return EnumToString<A2lMonotony, 7>(type, kMonotonyList);
}
EnumStringList MonotonyToStringList() {
return EnumToStringList<A2lMonotony,7>(kMonotonyList);
}
/*------------------ PRG TYPE -----------------------------*/
using StringPrgType = std::pair<std::string_view, A2lPrgType>;
constexpr std::array<StringPrgType, 3> kPrgList = {
std::pair("PRG_CODE", A2lPrgType::PRG_CODE),
std::pair("PRG_DATA", A2lPrgType::PRG_DATA),
std::pair("PRG_RESERVED", A2lPrgType::PRG_RESERVED),
};
A2lPrgType StringToPrgType(const std::string& text) {
return StringToEnum<A2lPrgType, 3>(text, kPrgList);
}
std::string_view PrgTypeToString(A2lPrgType type) {
return EnumToString<A2lPrgType, 3>(type, kPrgList);
}
EnumStringList PrgTypeToStringList() {
return EnumToStringList<A2lPrgType,3>(kPrgList);
}
/*----------------- SEGMENT TYPE -----------------------*/
using StringSegmentType = std::pair<std::string_view, A2lSegmentType>;
constexpr std::array<StringSegmentType, 8> kSegmentList = {
std::pair("CALIBRATION_VARIABLES", A2lSegmentType::CALIBRATION_VARIABLES),
std::pair("CODE", A2lSegmentType::CODE),
std::pair("DATA", A2lSegmentType::DATA),
std::pair("EXCLUDE_FROM_FLASH", A2lSegmentType::EXCLUDE_FROM_FLASH),
std::pair("OFFLINE_DATA", A2lSegmentType::OFFLINE_DATA),
std::pair("RESERVED", A2lSegmentType::RESERVED),
std::pair("SERAM", A2lSegmentType::SERAM),
std::pair("VARIABLES", A2lSegmentType::VARIABLES),
};
A2lSegmentType StringToSegmentType(const std::string& text) {
return StringToEnum<A2lSegmentType, 8>(text, kSegmentList);
}
std::string_view SegmentTypeToString(A2lSegmentType type) {
return EnumToString<A2lSegmentType, 8>(type, kSegmentList);
}
EnumStringList SegmentTypeToStringList() {
return EnumToStringList<A2lSegmentType,8>(kSegmentList);
}
/*------------------- TRIGGER ------------------------------*/
using StringTrigger = std::pair<std::string_view, A2lTrigger>;
constexpr std::array<StringTrigger, 2> kTriggerList = {
std::pair("ON_CHANGE", A2lTrigger::ON_CHANGE),
std::pair("ON_USER_REQUEST", A2lTrigger::ON_USER_REQUEST),
};
A2lTrigger StringToTrigger(const std::string& text) {
return StringToEnum<A2lTrigger, 2>(text, kTriggerList);
}
std::string_view TriggerToString(A2lTrigger trigger) {
return EnumToString<A2lTrigger, 2>(trigger, kTriggerList);
}
EnumStringList TriggerToStringList() {
return EnumToStringList<A2lTrigger,2>(kTriggerList);
}
/*------------------ TYPEDEF TYPE ---------------------*/
using StringTypedef = std::pair<std::string_view, A2lTypedefType>;
constexpr std::array<StringTypedef, 5> kTypedefList = {
std::pair("TYPEDEF_AXIS", A2lTypedefType::TYPEDEF_AXIS),
std::pair("TYPEDEF_BLOB", A2lTypedefType::TYPEDEF_BLOB),
std::pair("TYPEDEF_CHARACTERISTIC", A2lTypedefType::TYPEDEF_CHARACTERISTIC),
std::pair("TYPEDEF_MEASUREMENT", A2lTypedefType::TYPEDEF_MEASUREMENT),
std::pair("TYPEDEF_STRUCTURE", A2lTypedefType::TYPEDEF_STRUCTURE),
};
A2lTypedefType StringToTypedefType(const std::string& text) {
return StringToEnum<A2lTypedefType, 5>(text, kTypedefList);
}
std::string_view TypedefTypeToString(A2lTypedefType type) {
return EnumToString<A2lTypedefType, 5>(type, kTypedefList);
}
EnumStringList TypedefTypeToStringList() {
return EnumToStringList<A2lTypedefType,5>(kTypedefList);
}
/*------------------- UNIT TYPE ----------------------*/
using StringUnit = std::pair<std::string_view, A2lUnitType>;
constexpr std::array<StringUnit, 2> kUnitList = {
std::pair("DERIVED", A2lUnitType::DERIVED),
std::pair("EXTENDED_SI", A2lUnitType::EXTENDED_SI),
};
A2lUnitType StringToUnitType(const std::string& text) {
return StringToEnum<A2lUnitType, 2>(text, kUnitList);
}
std::string_view UnitTypeToString(A2lUnitType type) {
return EnumToString<A2lUnitType, 2>(type, kUnitList);
}
EnumStringList UnitTypeToStringList() {
return EnumToStringList<A2lUnitType,2>(kUnitList);
}
}

67
TestLibDlg/IncSourceTestDlg/src/a2lfile.cpp

@ -0,0 +1,67 @@
/*
* Copyright 2022 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/a2lfile.h"
#include <fstream>
#include <sstream>
#include <algorithm>
#include <filesystem>
#include <array>
#include <boost/locale.hpp>
#include <boost/endian.hpp>
#include "a2lscanner.h"
#include "a2lhelper.h"
namespace a2l {
std::string A2lFile::Name() const {
return A2lHelper::GetStem(filename_);
}
bool A2lFile::ParseFile() {
last_error_.clear();
bool parse = true;
try {
// Read in the file into a memory stream and convert to UTF8 coding at
// the same time
std::istringstream utf8_stream;
A2lScanner::ReadAndConvertFile(filename_, utf8_stream);
A2lScanner scanner(utf8_stream);
scanner.InputFile(filename_); // Needed in case of include files.
scanner.Parent(this);
// scanner.set_debug(2);
A2lParser parser(scanner, *this);
parse = parser.parse() == 0;
IsA2lFile(scanner.IsA2lFile());
last_error_ = scanner.LastError();
} catch (const std::exception& err) {
last_error_ = err.what();
parse = false;
} catch (...) {
parse = false;
}
return parse;
}
void A2lFile::Merge(A2lFile &include_file) {
// If this isn't an A2L file i.e. missing the project header, then copy the entire project.
// Always move the modules
auto& dest_project = Project();
auto& remote_project = include_file.Project();
if (!IsA2lFile()) {
dest_project.Header() = remote_project.Header();
}
auto& dest_list = dest_project.Modules();
auto& source_list = remote_project.Modules();
for (auto& itr : source_list) {
dest_project.AddModule(itr.second);
}
source_list.clear();
}
} // namespace a2l

4119
TestLibDlg/IncSourceTestDlg/src/a2lflexer.cpp

File diff suppressed because it is too large

400
TestLibDlg/IncSourceTestDlg/src/a2lflexer.l

@ -0,0 +1,400 @@
%top {
#include <cstdint>
#include <cctype>
}
%{
#include "a2lscanner.h"
#undef YY_DECL
#define YY_DECL int a2l::A2lScanner::a2llex(a2l::A2lParser::value_type* yy_value)
using token = a2l::A2lParser::token;
%}
%option prefix="a2l"
%option 8bit
%option nounistd
%option noyywrap
%option debug
%option never-interactive
%option c++
%option yyclass="a2l:A2lScanner"
%option yylineno
%option noinput
%option nounput
ws [ \t\n\v\f\r]+
signed_number [-+]?[0-9]+
unsigned_number [0-9]+
hexnumber 0[xX][0-9a-fA-F]+
float_val [-+]?[0-9]+(\.[0-9]*)?([eE][-+]?[0-9]+)?
ident [a-zA-Z_]([\[\]()/_a-zA-Z0-9.-]*)?
string (\"(\\.|[^\\"])*\")*
/* \"([^\"\\]|(\\.))*\" */
nl [\n\r]
keyword [A-Z_0-9]+
%s PRI VERSION TIMESTAMP HOSTNAME APPNAME PROCID MSGID SD SDELEMENT SDPAR SDVALUE MSG
%%
%{
yylval = yy_value;
%}
"ASAP2_VERSION" { return token::ASAP2_VERSION; }
"A2ML_VERSION" { return token::A2ML_VERSION; }
"ADDR_EPK" { return token::ADDR_EPK; }
"ADDRESS_TYPE" { return token::ADDRESS_TYPE; }
"ALIGNMENT_BYTE" { return token::ALIGNMENT_BYTE; }
"ALIGNMENT_FLOAT16_IEEE" { return token::ALIGNMENT_FLOAT16_IEEE; }
"ALIGNMENT_FLOAT32_IEEE" { return token::ALIGNMENT_FLOAT32_IEEE; }
"ALIGNMENT_FLOAT64_IEEE" { return token::ALIGNMENT_FLOAT64_IEEE; }
"ALIGNMENT_INT64" { return token::ALIGNMENT_INT64; }
"ALIGNMENT_LONG" { return token::ALIGNMENT_LONG; }
"ALIGNMENT_WORD" { return token::ALIGNMENT_WORD; }
"ANNOTATION" { return token::ANNOTATION; }
"ANNOTATION_LABEL" { return token::ANNOTATION_LABEL; }
"ANNOTATION_ORIGIN" { return token::ANNOTATION_ORIGIN; }
"ANNOTATION_TEXT" { return token::ANNOTATION_TEXT; }
"ARRAY_SIZE" { return token::ARRAY_SIZE; }
"AR_COMPONENT" { return token::AR_COMPONENT; }
"AR_PROTOTYPE_OF" { return token::AR_PROTOTYPE_OF; }
"AXIS_DESCR" { return token::AXIS_DESCR; }
"AXIS_PTS" { return token::AXIS_PTS; }
"AXIS_PTS_REF" { return token::AXIS_PTS_REF; }
"AXIS_PTS_X" { return token::AXIS_PTS_X; }
"AXIS_PTS_Y" { return token::AXIS_PTS_Y; }
"AXIS_PTS_Z" { return token::AXIS_PTS_Z; }
"AXIS_PTS_4" { return token::AXIS_PTS_4; }
"AXIS_PTS_5" { return token::AXIS_PTS_5; }
"AXIS_RESCALE_X" { return token::AXIS_RESCALE_X; }
"BIT_MASK" { return token::BIT_MASK; }
"BIT_OPERATION" { return token::BIT_OPERATION; }
"BLOB" { return token::BLOB; }
"BYTE_ORDER" { return token::A2L_BYTE_ORDER; }
"CALIBRATION_ACCESS" { return token::CALIBRATION_ACCESS; }
"CALIBRATION_HANDLE" { return token::CALIBRATION_HANDLE; }
"CALIBRATION_HANDLE_TEXT" { return token::CALIBRATION_HANDLE_TEXT; }
"CALIBRATION_METHOD" { return token::CALIBRATION_METHOD; }
"CHARACTERISTIC" { return token::CHARACTERISTIC; }
"COEFFS" { return token::COEFFS; }
"COEFFS_LINEAR" { return token::COEFFS_LINEAR; }
"COMPARISON_QUANTITY" { return token::COMPARISON_QUANTITY; }
"COMPU_METHOD" { return token::COMPU_METHOD; }
"COMPU_TAB" { return token::COMPU_TAB; }
"COMPU_TAB_REF" { return token::COMPU_TAB_REF; }
"COMPU_VTAB" { return token::COMPU_VTAB; }
"COMPU_VTAB_RANGE" { return token::COMPU_VTAB_RANGE; }
"CONSISTENT_EXCHANGE" { return token::CONSISTENT_EXCHANGE; }
"CONTROLLER_ADDRESSES" { return token::CONTROLLER_ADDRESSES; }
"CONVERSION" { return token::CONVERSION; }
"CPU_TYPE" { return token::CPU_TYPE; }
"CURVE_AXIS_REF" { return token::CURVE_AXIS_REF; }
"CUSTOMER" { return token::CUSTOMER; }
"CUSTOMER_NO" { return token::CUSTOMER_NO; }
"DATA_SIZE" { return token::DATA_SIZE; }
"DEF_CHARACTERISTIC" { return token::DEF_CHARACTERISTIC; }
"DEFAULT_VALUE" { return token::DEFAULT_VALUE; }
"DEFAULT_VALUE_NUMERIC" { return token::DEFAULT_VALUE_NUMERIC; }
"DEPENDENT_CHARACTERISTIC" { return token::DEPENDENT_CHARACTERISTIC; }
"DEPOSIT" { return token::DEPOSIT; }
"DISCRETE" { return token::DISCRETE; }
"DISPLAY_IDENTIFIER" { return token::DISPLAY_IDENTIFIER; }
"DIST_OP_X" { return token::DIST_OP_X; }
"DIST_OP_Y" { return token::DIST_OP_Y; }
"DIST_OP_Z" { return token::DIST_OP_Z; }
"DIST_OP_4" { return token::DIST_OP_4; }
"DIST_OP_5" { return token::DIST_OP_5; }
"ECU" { return token::ECU; }
"ECU_ADDRESS" { return token::ECU_ADDRESS; }
"ECU_ADDRESS_EXTENSION" { return token::ECU_ADDRESS_EXTENSION; }
"ECU_CALIBRATION_OFFSET" { return token::ECU_CALIBRATION_OFFSET; }
"ENCODING" { return token::ENCODING; }
"EPK" { return token::EPK; }
"ERROR_MASK" { return token::ERROR_MASK; }
"EXTENDED_LIMITS" { return token::EXTENDED_LIMITS; }
"FIX_AXIS_PAR" { return token::FIX_AXIS_PAR; }
"FIX_AXIS_PAR_DIST" { return token::FIX_AXIS_PAR_DIST; }
"FIX_AXIS_PAR_LIST" { return token::FIX_AXIS_PAR_LIST; }
"FIX_NO_AXIS_PTS_X" { return token::FIX_NO_AXIS_PTS_X; }
"FIX_NO_AXIS_PTS_Y" { return token::FIX_NO_AXIS_PTS_Y; }
"FIX_NO_AXIS_PTS_Z" { return token::FIX_NO_AXIS_PTS_Z; }
"FIX_NO_AXIS_PTS_4" { return token::FIX_NO_AXIS_PTS_4; }
"FIX_NO_AXIS_PTS_5" { return token::FIX_NO_AXIS_PTS_5; }
"FNC_VALUES" { return token::FNC_VALUES; }
"FORMAT" { return token::FORMAT; }
"FORMULA" { return token::FORMULA; }
"FORMULA_INV" { return token::FORMULA_INV; }
"FRAME" { return token::FRAME; }
"FRAME_MEASUREMENT" { return token::FRAME_MEASUREMENT; }
"FUNCTION" { return token::FUNCTION; }
"FUNCTION_LIST" { return token::FUNCTION_LIST; }
"FUNCTION_VERSION" { return token::FUNCTION_VERSION; }
"GROUP" { return token::GROUP; }
"GUARD_RAILS" { return token::GUARD_RAILS; }
"HEADER" { return token::HEADER; }
"IDENTIFICATION" { return token::IDENTIFICATION; }
"IN_MEASUREMENT" { return token::IN_MEASUREMENT; }
"INPUT_QUANTITY" { return token::INPUT_QUANTITY; }
"INSTANCE" { return token::INSTANCE; }
"LAYOUT" { return token::LAYOUT; }
"LEFT_SHIFT" { return token::LEFT_SHIFT; }
"LIMITS" { return token::LIMITS; }
"LOC_MEASUREMENT" { return token::LOC_MEASUREMENT; }
"MAP_LIST" { return token::MAP_LIST; }
"MATRIX_DIM" { return token::MATRIX_DIM; }
"MAX_GRAD" { return token::MAX_GRAD; }
"MAX_REFRESH" { return token::MAX_REFRESH; }
"MEASUREMENT" { return token::MEASUREMENT; }
"MEMORY_LAYOUT" { return token::MEMORY_LAYOUT; }
"MEMORY_SEGMENT" { return token::MEMORY_SEGMENT; }
"MOD_COMMON" { return token::MOD_COMMON; }
"MOD_PAR" { return token::MOD_PAR; }
"MODEL_LINK" { return token::MODEL_LINK; }
"MODULE" { return token::MODULE; }
"MONOTONY" { return token::MONOTONY; }
"NO_AXIS_PTS_X" { return token::NO_AXIS_PTS_X; }
"NO_AXIS_PTS_Y" { return token::NO_AXIS_PTS_Y; }
"NO_AXIS_PTS_Z" { return token::NO_AXIS_PTS_Z; }
"NO_AXIS_PTS_4" { return token::NO_AXIS_PTS_4; }
"NO_AXIS_PTS_5" { return token::NO_AXIS_PTS_5; }
"NO_OF_INTERFACES" { return token::NO_OF_INTERFACES; }
"NO_RESCALE_X" { return token::NO_RESCALE_X; }
"NUMBER" { return token::NUMBER; }
"OFFSET_X" { return token::OFFSET_X; }
"OFFSET_Y" { return token::OFFSET_Y; }
"OFFSET_Z" { return token::OFFSET_Z; }
"OFFSET_4" { return token::OFFSET_4; }
"OFFSET_5" { return token::OFFSET_5; }
"OUT_MEASUREMENT" { return token::OUT_MEASUREMENT; }
"OVERWRITE" { return token::OVERWRITE; }
"PHONE_NO" { return token::PHONE_NO; }
"PHYS_UNIT" { return token::PHYS_UNIT; }
"PROJECT" {
found_ = true;
return token::PROJECT;
}
"PROJECT_NO" { return token::PROJECT_NO; }
"READ_ONLY" { return token::READ_ONLY; }
"READ_WRITE" { return token::READ_WRITE; }
"RECORD_LAYOUT" { return token::RECORD_LAYOUT; }
"REF_CHARACTERISTIC" { return token::REF_CHARACTERISTIC; }
"REF_GROUP" { return token::REF_GROUP; }
"REF_MEASUREMENT" { return token::REF_MEASUREMENT; }
"REF_MEMORY_SEGMENT" { return token::REF_MEMORY_SEGMENT; }
"REF_UNIT" { return token::REF_UNIT; }
"RESERVED" { return token::RESERVED; }
"RIGHT_SHIFT" { return token::RIGHT_SHIFT; }
"RIP_ADDR_W" { return token::RIP_ADDR_W; }
"RIP_ADDR_X" { return token::RIP_ADDR_X; }
"RIP_ADDR_Y" { return token::RIP_ADDR_Y; }
"RIP_ADDR_Z" { return token::RIP_ADDR_Z; }
"RIP_ADDR_4" { return token::RIP_ADDR_4; }
"RIP_ADDR_5" { return token::RIP_ADDR_5; }
"ROOT" { return token::ROOT; }
"S_REC_LAYOUT" { return token::S_REC_LAYOUT; } /* Deprecated */
"SHIFT_OP_X" { return token::SHIFT_OP_X; }
"SHIFT_OP_Y" { return token::SHIFT_OP_Y; }
"SHIFT_OP_Z" { return token::SHIFT_OP_Z; }
"SHIFT_OP_4" { return token::SHIFT_OP_4; }
"SHIFT_OP_5" { return token::SHIFT_OP_5; }
"SIGN_EXTEND" { return token::SIGN_EXTEND; }
"SI_EXPONENTS" { return token::SI_EXPONENTS; }
"SRC_ADDR_X" { return token::SRC_ADDR_X; }
"SRC_ADDR_Y" { return token::SRC_ADDR_Y; }
"SRC_ADDR_Z" { return token::SRC_ADDR_Z; }
"SRC_ADDR_4" { return token::SRC_ADDR_4; }
"SRC_ADDR_5" { return token::SRC_ADDR_5; }
"STATIC_ADDRESS_OFFSETS" { return token::STATIC_ADDRESS_OFFSETS; }
"STATIC_RECORD_LAYOUT" { return token::STATIC_RECORD_LAYOUT; }
"STATUS_STRING_REF" { return token::STATUS_STRING_REF; }
"STEP_SIZE" { return token::STEP_SIZE; }
"STRUCTURE_COMPONENT" { return token::STRUCTURE_COMPONENT; }
"SUB_FUNCTION" { return token::SUB_FUNCTION; }
"SUB_GROUP" { return token::SUB_GROUP; }
"SUPPLIER" { return token::SUPPLIER; }
"SYMBOL_LINK" { return token::SYMBOL_LINK; }
"SYMBOL_TYPE_LINK" { return token::SYMBOL_TYPE_LINK; }
"SYSTEM_CONSTANT" { return token::SYSTEM_CONSTANT; }
"TRANSFORMER" { return token::TRANSFORMER; }
"TRANSFORMER_IN_OBJECTS" { return token::TRANSFORMER_IN_OBJECTS; }
"TRANSFORMER_OUT_OBJECTS" { return token::TRANSFORMER_OUT_OBJECTS; }
"TYPEDEF_AXIS" { return token::TYPEDEF_AXIS; }
"TYPEDEF_BLOB" { return token::TYPEDEF_BLOB; }
"TYPEDEF_CHARACTERISTIC" { return token::TYPEDEF_CHARACTERISTIC; }
"TYPEDEF_MEASUREMENT" { return token::TYPEDEF_MEASUREMENT; }
"TYPEDEF_STRUCTURE" { return token::TYPEDEF_STRUCTURE; }
"UNIT" { return token::UNIT; }
"UNIT_CONVERSION" { return token::UNIT_CONVERSION; }
"USER" { return token::USER; }
"USER_RIGHTS" { return token::USER_RIGHTS; }
"VAR_ADDRESS" { return token::VAR_ADDRESS; }
"VAR_CHARACTERISTIC" { return token::VAR_CHARACTERISTIC; }
"VAR_CRITERION" { return token::VAR_CRITERION; }
"VAR_FORBIDDEN_COMB" { return token::VAR_FORBIDDEN_COMB; }
"VAR_MEASUREMENT" { return token::VAR_MEASUREMENT; }
"VAR_NAMING" { return token::VAR_NAMING; }
"VAR_SELECTION_CHARACTERISTIC" { return token::VAR_SELECTION_CHARACTERISTIC; }
"VAR_SEPARATOR" { return token::VAR_SEPARATOR; }
"VARIANT_CODING" { return token::VARIANT_CODING; }
"VERSION" { return token::A2L_VERSION; }
"VIRTUAL" { return token::VIRTUAL; }
"VIRTUAL_CHARACTERISTIC" { return token::VIRTUAL_CHARACTERISTIC; }
"/begin"{ws}"A2ML" {
// Read in the format specification
if (yylval != nullptr) {
yylval->emplace<std::string>(ReadA2ML());
}
return token::A2ML;
}
"/begin"{ws}"IF_DATA" {
// Read in the if_data string
if (yylval != nullptr) {
yylval->emplace<std::string>(ReadIfData());
}
return token::IF_DATA;
}
"IF_DATA"{ws}"{" {
// Read in the if_data string until end of line
if(yylval != nullptr ) {
yylval->emplace<std::string>(ReadIfDataMultiLine());
}
return token::IF_DATA;
}
"IF_DATA" {
// Read in the if_data string until end of line
if (yylval != nullptr) {
yylval->emplace<std::string>(ReadIfDataSingleLine());
}
return token::IF_DATA;
}
"FUNCTION"{ws}"{" { SkipUntil('}'); }
"/begin" { return token::A2L_BEGIN; }
"/end" { return token::A2L_END; }
"/include" {
FixIncludeFile();
}
{ident} {
const std::string temp(yytext);
if (yylval != nullptr) {
yylval->emplace<std::string>(temp);
}
return token::IDENT;
}
{string} {
const size_t len = strlen(yytext);
std::string temp;
if (len > 2) {
temp = yytext + 1;
temp.pop_back();
}
yylval->emplace<std::string>(temp);
return token::STRING;
}
{hexnumber} {
uint64_t address = 0;
for ( size_t index = 0; yytext[ index ] != '\0'; ++index ) {
if ( index < 2 ) continue;
const char token = yytext[index];
switch ( token ) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
address *= 16;
address += token - '0';
break;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
address *= 16;
address += token - 'A' + 10;
break;
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
address *= 16;
address += token - 'a' + 10;
break;
default:
break;
}
}
yylval->emplace<uint64_t>(address);
return token::HEX;
}
{unsigned_number} {
uint64_t temp = 0;
try {
temp = std::stoull(yytext);
} catch (const std::exception& ) {
}
yylval->emplace<uint64_t>(temp);
return token::UINT;
}
{signed_number} {
int64_t temp = 0;
try {
temp = std::stoll(yytext);
} catch (const std::exception& ) {
}
yylval->emplace<int64_t>(temp);
return token::INT;
}
{float_val} {
double temp = 0.0;
try {
temp = std::stod(yytext);
} catch (const std::exception&) {
}
yylval->emplace<double>(temp);
return token::FLOAT;
}
[/][*][^*]*[*]+([^*/][^*]*[*]+)*[/] { } /* Multi line comments */
"//".* { /* Single line comment */ }
{ws} {}
. {}
<<EOF>> {
if (file_stack_.size() <= 1) {
yyterminate();
} else {
auto& last_item = file_stack_.back();
yy_delete_buffer(last_item.buffer_state);
file_stack_.pop_back();
auto& current_item = file_stack_.back();
yy_switch_to_buffer(current_item.buffer_state);
}
}
%%

706
TestLibDlg/IncSourceTestDlg/src/a2lhelper.cpp

@ -0,0 +1,706 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2lhelper.h"
#include <cstring>
#include <fstream>
#include <sstream>
namespace {
constexpr uint8_t kMask[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
using signed64 = union {
int64_t val1 : 1;
int64_t val2 : 2;
int64_t val3 : 3;
int64_t val4 : 4;
int64_t val5 : 5;
int64_t val6 : 6;
int64_t val7 : 7;
int64_t val8 : 8;
int64_t val9 : 9;
int64_t val10 : 10;
int64_t val11 : 11;
int64_t val12 : 12;
int64_t val13 : 13;
int64_t val14 : 14;
int64_t val15 : 15;
int64_t val16 : 16;
int64_t val17 : 17;
int64_t val18 : 18;
int64_t val19 : 19;
int64_t val20 : 20;
int64_t val21 : 21;
int64_t val22 : 22;
int64_t val23 : 23;
int64_t val24 : 24;
int64_t val25 : 25;
int64_t val26 : 26;
int64_t val27 : 27;
int64_t val28 : 28;
int64_t val29 : 29;
int64_t val30 : 30;
int64_t val31 : 31;
int64_t val32 : 32;
int64_t val33 : 33;
int64_t val34 : 34;
int64_t val35 : 35;
int64_t val36 : 36;
int64_t val37 : 37;
int64_t val38 : 38;
int64_t val39 : 39;
int64_t val40 : 40;
int64_t val41 : 41;
int64_t val42 : 42;
int64_t val43 : 43;
int64_t val44 : 44;
int64_t val45 : 45;
int64_t val46 : 46;
int64_t val47 : 47;
int64_t val48 : 48;
int64_t val49 : 49;
int64_t val50 : 50;
int64_t val51 : 51;
int64_t val52 : 52;
int64_t val53 : 53;
int64_t val54 : 54;
int64_t val55 : 55;
int64_t val56 : 56;
int64_t val57 : 57;
int64_t val58 : 58;
int64_t val59 : 59;
int64_t val60 : 60;
int64_t val61 : 61;
int64_t val62 : 62;
int64_t val63 : 63;
int64_t val64 : 64;
};
} // end namespace empty
namespace a2l {
void A2lHelper::DoubleToRaw(bool little_endian, size_t start, size_t length,
double value, uint8_t* dest) {
if (dest == nullptr || length < 64) {
return;
}
length = 64;
uint64_t mask = 1ULL << 63;
uint64_t temp = 0;
memcpy(&temp, &value, sizeof(temp));
auto bit = little_endian ? static_cast<int>(start + length - 1)
: static_cast<int>(start);
auto byte = bit / 8;
bit %= 8;
for (size_t index = 0; index < length; ++index) {
if ((temp & mask) != 0) {
dest[byte] |= kMask[bit];
} else {
dest[byte] &= ~kMask[bit];
}
mask >>= 1;
--bit;
if (bit < 0) {
bit = 7;
little_endian ? --byte : ++byte;
}
if (byte >= (start + length) /8) {
// Buffer overrun. Most likely invalid start bit
break;
}
}
}
void A2lHelper::FloatToRaw(bool little_endian, size_t start, size_t length,
float value, uint8_t* raw) {
if (raw == nullptr || length < 32) {
return;
}
length = 32;
uint32_t mask = 1UL << 31;
uint32_t temp = 0;
memcpy(&temp, &value, sizeof(temp));
auto bit = little_endian ? static_cast<int>(start + length - 1)
: static_cast<int>(start);
auto byte = bit / 8;
bit %= 8;
for (size_t index = 0; index < length; ++index) {
if ((temp & mask) != 0) {
raw[byte] |= kMask[bit];
} else {
raw[byte] &= ~kMask[bit];
}
mask >>= 1;
--bit;
if (bit < 0) {
bit = 7;
little_endian ? --byte : ++byte;
}
if (byte >= (start + length) / 8) {
// Buffer overrun. Most likely invalid start bit
break;
}
}
}
void A2lHelper::SignedToRaw(bool little_endian, size_t start, size_t length,
int64_t value, uint8_t* raw) {
if (raw == nullptr || length == 0) {
return;
}
signed64 temp_val{};
switch (length) {
case 1:
temp_val.val1 = value;
break;
case 2:
temp_val.val2 = value;
break;
case 3:
temp_val.val3 = value;
break;
case 4:
temp_val.val4 = value;
break;
case 5:
temp_val.val5 = value;
break;
case 6:
temp_val.val6 = value;
break;
case 7:
temp_val.val7 = value;
break;
case 8:
temp_val.val8 = value;
break;
case 9:
temp_val.val9 = value;
break;
case 10:
temp_val.val10 = value;
break;
case 11:
temp_val.val11 = value;
break;
case 12:
temp_val.val12 = value;
break;
case 13:
temp_val.val13 = value;
break;
case 14:
temp_val.val14 = value;
break;
case 15:
temp_val.val15 = value;
break;
case 16:
temp_val.val16 = value;
break;
case 17:
temp_val.val17 = value;
break;
case 18:
temp_val.val18 = value;
break;
case 19:
temp_val.val19 = value;
break;
case 20:
temp_val.val20 = value;
break;
case 21:
temp_val.val21 = value;
break;
case 22:
temp_val.val22 = value;
break;
case 23:
temp_val.val23 = value;
break;
case 24:
temp_val.val24 = value;
break;
case 25:
temp_val.val25 = value;
break;
case 26:
temp_val.val26 = value;
break;
case 27:
temp_val.val27 = value;
break;
case 28:
temp_val.val28 = value;
break;
case 29:
temp_val.val29 = value;
break;
case 30:
temp_val.val30 = value;
break;
case 31:
temp_val.val31 = value;
break;
case 32:
temp_val.val32 = value;
break;
case 33:
temp_val.val33 = value;
break;
case 34:
temp_val.val34 = value;
break;
case 35:
temp_val.val35 = value;
break;
case 36:
temp_val.val36 = value;
break;
case 37:
temp_val.val37 = value;
break;
case 38:
temp_val.val38 = value;
break;
case 39:
temp_val.val39 = value;
break;
case 40:
temp_val.val40 = value;
break;
case 41:
temp_val.val41 = value;
break;
case 42:
temp_val.val42 = value;
break;
case 43:
temp_val.val43 = value;
break;
case 44:
temp_val.val44 = value;
break;
case 45:
temp_val.val45 = value;
break;
case 46:
temp_val.val46 = value;
break;
case 47:
temp_val.val47 = value;
break;
case 48:
temp_val.val48 = value;
break;
case 49:
temp_val.val49 = value;
break;
case 50:
temp_val.val50 = value;
break;
case 51:
temp_val.val51 = value;
break;
case 52:
temp_val.val52 = value;
break;
case 53:
temp_val.val53 = value;
break;
case 54:
temp_val.val54 = value;
break;
case 55:
temp_val.val55 = value;
break;
case 56:
temp_val.val56 = value;
break;
case 57:
temp_val.val57 = value;
break;
case 58:
temp_val.val58 = value;
break;
case 59:
temp_val.val59 = value;
break;
case 60:
temp_val.val60 = value;
break;
case 61:
temp_val.val61 = value;
break;
case 62:
temp_val.val62 = value;
break;
case 63:
temp_val.val63 = value;
break;
case 64:
temp_val.val64 = value;
break;
default:
return;
}
uint64_t mask = 1ULL << (length - 1);
uint64_t temp = 0;
memcpy(&temp, &temp_val, sizeof(temp));
auto bit = little_endian ? static_cast<int>(start + length - 1)
: static_cast<int>(start);
auto byte = bit / 8;
bit %= 8;
for (size_t index = 0; index < length; ++index) {
if ((temp & mask) != 0) {
raw[byte] |= kMask[bit];
} else {
raw[byte] &= ~kMask[bit];
}
mask >>= 1;
--bit;
if (bit < 0) {
bit = 7;
little_endian ? --byte : ++byte;
}
}
}
void A2lHelper::UnsignedToRaw(bool little_endian, size_t start, size_t length,
uint64_t value, uint8_t* raw) {
if (raw == nullptr || length == 0) {
return;
}
uint64_t mask = 1ULL << (length - 1);
auto bit = little_endian ? static_cast<int>(start + length - 1)
: static_cast<int>(start);
auto byte = bit / 8;
bit %= 8;
for (size_t index = 0; index < length; ++index) {
if ((value & mask) != 0) {
raw[byte] |= kMask[bit];
} else {
raw[byte] &= ~kMask[bit];
}
mask >>= 1;
--bit;
if (bit < 0) {
bit = 7;
little_endian ? --byte : ++byte;
}
}
}
std::vector<uint8_t> A2lHelper::RawToByteArray(size_t start, size_t length,
const unsigned char* raw )
{
// Only byte aligned strings are supported
if ( raw == nullptr || (length % 8) != 0 || (start % 8) != 0) {
return {};
}
const auto byte_start = start / 8;
const auto byte_size = length / 8;
std::vector<uint8_t> temp;
temp.resize(byte_size, 0);
memcpy(temp.data(), raw + byte_start, byte_size);
return temp;
}
double A2lHelper::RawToDouble(bool little_endian, size_t start, size_t length,
const unsigned char* raw )
{
double value = 0.0;
uint64_t temp = 0;
uint64_t mask = 1ULL << ( length - 1 );
auto bit = little_endian ? static_cast<int>(start + length - 1)
: static_cast<int>(start);
auto byte = bit / 8;
bit %= 8;
for (size_t index = 0; index < length; ++index ) {
if ((raw[byte] & kMask[bit] ) != 0) {
temp |= mask;
}
mask >>= 1;
--bit;
if (bit < 0) {
bit = 7;
little_endian ? --byte : ++byte;
}
}
memcpy( &value, &temp, sizeof(value));
return value;
}
float A2lHelper::RawToFloat(bool little_endian, size_t start, size_t length,
const unsigned char* raw )
{
float value = 0.0;
uint32_t temp = 0;
uint32_t mask = 1ULL << ( length - 1 );
auto bit = little_endian ? static_cast<int>(start + length - 1)
: static_cast<int>(start);
auto byte = bit / 8;
bit %= 8;
for (size_t index = 0; index < length; ++index ) {
if ((raw[byte] & kMask[bit] ) != 0) {
temp |= mask;
}
mask >>= 1;
--bit;
if (bit < 0) {
bit = 7;
little_endian ? --byte : ++byte;
}
}
memcpy( &value, &temp, sizeof(value));
return value;
}
int64_t A2lHelper::RawToSigned(bool little_endian, size_t start, size_t length,
const uint8_t* raw )
{
int64_t value = 0;
uint64_t temp = 0;
auto bit = little_endian ? static_cast<int>(start + length - 1)
: static_cast<int>(start);
auto byte = bit / 8;
bit %= 8;
for (size_t index = 0; index < length; ++index) {
if ( index > 0 ) temp <<= 1;
if ((raw[byte] & kMask[bit]) != 0) {
temp |= 1;
}
--bit;
if (bit < 0) {
bit = 7;
little_endian ? --byte : ++byte;
}
}
signed64 temp_value {};
memcpy( &temp_value, &temp, sizeof(temp));
switch ( length ) {
case 1: value = temp_value.val1; break;
case 2: value = temp_value.val2; break;
case 3: value = temp_value.val3; break;
case 4: value = temp_value.val4; break;
case 5: value = temp_value.val5; break;
case 6: value = temp_value.val6; break;
case 7: value = temp_value.val7; break;
case 8: value = temp_value.val8; break;
case 9: value = temp_value.val9; break;
case 10: value = temp_value.val10; break;
case 11: value = temp_value.val11; break;
case 12: value = temp_value.val12; break;
case 13: value = temp_value.val13; break;
case 14: value = temp_value.val14; break;
case 15: value = temp_value.val15; break;
case 16: value = temp_value.val16; break;
case 17: value = temp_value.val17; break;
case 18: value = temp_value.val18; break;
case 19: value = temp_value.val19; break;
case 20: value = temp_value.val20; break;
case 21: value = temp_value.val21; break;
case 22: value = temp_value.val22; break;
case 23: value = temp_value.val23; break;
case 24: value = temp_value.val24; break;
case 25: value = temp_value.val25; break;
case 26: value = temp_value.val26; break;
case 27: value = temp_value.val27; break;
case 28: value = temp_value.val28; break;
case 29: value = temp_value.val29; break;
case 30: value = temp_value.val30; break;
case 31: value = temp_value.val31; break;
case 32: value = temp_value.val32; break;
case 33: value = temp_value.val33; break;
case 34: value = temp_value.val34; break;
case 35: value = temp_value.val35; break;
case 36: value = temp_value.val36; break;
case 37: value = temp_value.val37; break;
case 38: value = temp_value.val38; break;
case 39: value = temp_value.val39; break;
case 40: value = temp_value.val40; break;
case 41: value = temp_value.val41; break;
case 42: value = temp_value.val42; break;
case 43: value = temp_value.val43; break;
case 44: value = temp_value.val44; break;
case 45: value = temp_value.val45; break;
case 46: value = temp_value.val46; break;
case 47: value = temp_value.val47; break;
case 48: value = temp_value.val48; break;
case 49: value = temp_value.val49; break;
case 50: value = temp_value.val50; break;
case 51: value = temp_value.val51; break;
case 52: value = temp_value.val52; break;
case 53: value = temp_value.val53; break;
case 54: value = temp_value.val54; break;
case 55: value = temp_value.val55; break;
case 56: value = temp_value.val56; break;
case 57: value = temp_value.val57; break;
case 58: value = temp_value.val58; break;
case 59: value = temp_value.val59; break;
case 60: value = temp_value.val60; break;
case 61: value = temp_value.val61; break;
case 62: value = temp_value.val62; break;
case 63: value = temp_value.val63; break;
case 64: value = temp_value.val64; break;
default:
break;
}
return value;
}
uint64_t A2lHelper::RawToUnsigned(bool little_endian, size_t start,
size_t length, const uint8_t* raw)
{
uint64_t value = 0;
auto bit = little_endian ? static_cast<int>(start + length - 1)
: static_cast<int>(start);
auto byte = bit / 8;
bit %= 8;
for (size_t index = 0; index < length; ++index) {
if (index > 0) {
value <<= 1;
}
if ((raw[byte] & kMask[bit]) != 0) {
value |= 1;
}
--bit;
if (bit < 0) {
bit = 7;
little_endian ? --byte : ++byte;
}
}
return value;
}
void A2lHelper::SetAllBits(size_t start, size_t length, uint8_t* raw ) {
if (raw == nullptr) {
return;
}
for ( size_t index = 0; index < length; ++index) {
auto bit = start + index;
const auto byte = bit / 8;
bit %= 8;
raw[byte] |= kMask[bit];
}
}
bool A2lHelper::IsAllBitsSet(size_t start, size_t length, const uint8_t* raw) {
if (raw == nullptr) {
return true;
}
if (length <= 1) {
return false; // 1 bit cannot have an invalid flag
}
for (size_t index = 0; index < length; ++index) {
auto bit = start + index;
const auto byte = bit / 8;
bit %= 8;
if ((raw[byte] & kMask[bit]) == 0 ) {
return false;
}
}
return true;
}
std::string A2lHelper::GetStem(const std::string& path) {
// First parse out the file name
const auto last_back_pos = path.find_last_of('\\');
const auto back_pos = last_back_pos != std::string::npos;
const auto last_forward_pos = path.find_last_of('/');
const auto forward_pos = last_forward_pos != std::string::npos;
std::string filename;
if (back_pos && forward_pos) {
if ( last_back_pos > last_forward_pos) {
// Use backward slash position
filename = path.substr(last_back_pos + 1);
} else {
// Use forward slash position
filename = path.substr(last_forward_pos + 1);
}
} else if (back_pos) {
filename = path.substr(last_back_pos + 1);
} else if (forward_pos) {
filename = path.substr(last_forward_pos + 1);
} else {
filename = path;
}
// Strip out the extension
std::string stem;
const auto last_dot_pos = filename.find_last_of('.');
if (last_dot_pos != std::string::npos) {
stem = filename.substr(0,last_dot_pos);
} else {
stem = filename;
}
return stem;
}
bool A2lHelper::FileExist(const std::string& path) {
std::ifstream temp(path);
return temp.good();
}
bool A2lHelper::IsLittleEndian() {
constexpr int temp = 1;
return *((const int8_t*) &temp) == 1;
}
std::string A2lHelper::ParseIfDataProtocol(const std::string& input) {
constexpr std::string_view begin = "/begin";
constexpr std::string_view if_data = "IF_DATA";
size_t pos = 0;
if (strncmp(input.data(), begin.data(), begin.size()) != 0) {
return {};
}
pos += begin.size();
while (std::isspace(input[pos])) {
++pos;
}
if (strncmp(input.data() + pos, if_data.data(), if_data.size()) != 0) {
return {};
}
pos += if_data.size();
while (std::isspace(input[pos])) {
++pos;
}
std::ostringstream protocol;
while (input[pos] != '\0' && !std::isspace(input[pos])) {
protocol << input[pos];
++pos;
}
return protocol.str();
}
int A2lHelper::stricmp(const char *__s1, const char *__s2) {
#if (_MSC_VER)
return _stricmp(__s1, __s2);
#else
return strcasecmp(__s1, __s2);
#endif
}
}

55
TestLibDlg/IncSourceTestDlg/src/a2lhelper.h

@ -0,0 +1,55 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <cstdint>
#include <string>
#include <vector>
namespace a2l {
class A2lHelper {
public:
static void DoubleToRaw(bool little_endian, size_t start, size_t length,
double value, uint8_t* dest);
static void FloatToRaw(bool little_endian, size_t start, size_t length,
float value, uint8_t* dest);
static void SignedToRaw(bool little_endian, size_t start, size_t length,
int64_t value, uint8_t* raw);
static void UnsignedToRaw(bool little_endian, size_t start, size_t length,
uint64_t value, uint8_t* raw);
static std::vector<uint8_t> RawToByteArray(size_t start, size_t length,
const unsigned char* raw);
static double RawToDouble(bool little_endian, size_t start, size_t length,
const unsigned char* raw);
static float RawToFloat(bool little_endian, size_t start, size_t length,
const unsigned char* raw);
static int64_t RawToSigned(bool little_endian, size_t start, size_t length,
const uint8_t* raw);
static uint64_t RawToUnsigned(bool little_endian, size_t start, size_t length,
const uint8_t* raw);
static void SetAllBits(size_t start, size_t length, uint8_t* raw);
static bool IsAllBitsSet(size_t start, size_t length, const uint8_t* raw);
static std::string GetStem(const std::string& path);
static bool FileExist(const std::string& path);
static bool IsLittleEndian();
static std::string ParseIfDataProtocol(const std::string& input);
static int stricmp(const char *__s1, const char *__s2);
};
} // end namespace

32
TestLibDlg/IncSourceTestDlg/src/a2lobject.cpp

@ -0,0 +1,32 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/a2lobject.h"
#include <sstream>
#include <algorithm>
#include "a2lhelper.h"
namespace a2l {
void A2lObject::AddIfData(const std::string& input) {
const auto protocol = A2lHelper::ParseIfDataProtocol(input);
if (protocol.empty()) {
return;
}
if_data_list_.emplace(protocol,input);
}
void A2lObject::AddAnnotation(const A2lAnnotation& annotation) {
annotation_list_.emplace_back(annotation);
}
bool A2lObject::HaveIfData(const std::string_view& protocol) const {
return std::any_of(if_data_list_.cbegin(), if_data_list_.cend(),
[&] (const auto& itr) {
return itr.first == protocol;
});
}
} // end namespace a2l

7918
TestLibDlg/IncSourceTestDlg/src/a2lparser.cpp

File diff suppressed because it is too large

6331
TestLibDlg/IncSourceTestDlg/src/a2lparser.hpp

File diff suppressed because it is too large

1671
TestLibDlg/IncSourceTestDlg/src/a2lparser.y

File diff suppressed because it is too large

14
TestLibDlg/IncSourceTestDlg/src/a2lproject.cpp

@ -0,0 +1,14 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/a2lproject.h"
namespace a2l {
void A2lProject::AddModule(std::unique_ptr<Module>& module) {
module_list_.emplace(module->Name(), std::move(module));
}
} // namespace a2l

523
TestLibDlg/IncSourceTestDlg/src/a2lscanner.cpp

@ -0,0 +1,523 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2lscanner.h"
#include <filesystem>
#include <sstream>
#include <array>
#include <cstring>
#include <boost/locale.hpp>
#include <boost/endian.hpp>
#include "a2l/a2lfile.h"
#include "a2lhelper.h"
using namespace std::filesystem;
using namespace boost::locale;
using namespace boost::endian;
namespace {
constexpr std::array<std::string_view,5> BomList = {
std::string_view("\x00\x00\xFE\xFF",4),
std::string_view("\xFF\xFE\x00\x00",4),
std::string_view("\xFE\xFF",2),
std::string_view("\xFF\xFE",2),
std::string_view("\xEF\xBB\xBF", 3)
};
enum class FileEncoding : int {
UTF32_BE = 0,
UTF32_LE,
UTF16_BE,
UTF16_LE,
UTF8,
ASCII
};
}
namespace a2l {
A2lScanner::A2lScanner(std::istringstream& message)
: a2lFlexLexer(&message), yylval(nullptr) {
// I add a dummy file item onto the stack. This item is used to store
// the current stack state pointer in case of an include file.
file_stack_.emplace_back("");
}
void A2lScanner::ReadAndConvertFile(const std::string& filename, std::istringstream& utf8_stream) {
const std::u8string file_utf8 =
reinterpret_cast<const char8_t*>(filename.c_str());
const path file_path(file_utf8);
// Check if the file exist
if (!exists(file_path)) {
std::ostringstream error;
error << "The file doesn't exist. File: " << filename;
throw std::runtime_error(error.str());
}
// Check file size
const auto size = file_size(file_path);
if (size <= 4) {
std::ostringstream error;
error << "The file is empty. File: " << filename;
throw std::runtime_error(error.str());
}
std::string temp_buffer;
std::ifstream file(file_path, std::ios::binary | std::ios::in);
auto itr = std::istreambuf_iterator<char>(file);
auto end = std::istreambuf_iterator<char>();
temp_buffer.append(itr, end);
file.close();
auto encoding = FileEncoding::ASCII;
int enc = 0;
for (const auto& bom : BomList) {
if (temp_buffer.compare(0,bom.length(), bom) == 0) {
encoding = static_cast<FileEncoding>(enc);
temp_buffer = temp_buffer.substr(bom.length());
break;
}
++enc;
}
switch (encoding) {
case FileEncoding::UTF32_BE:{
const auto size32 = temp_buffer.length() / 4;
std::u32string temp32(size32, 0);
for (size_t index = 0; index < size32; ++index) {
const auto input =
static_cast<uint32_t>(static_cast<uint8_t>(temp_buffer[index * 4]));
temp32[index] = big_to_native(input);
}
utf8_stream.str( conv::to_utf<char>(temp_buffer,"UTF-32"));
break;
}
case FileEncoding::UTF32_LE:{
const auto size32 = temp_buffer.length() / 4;
std::u32string temp32(size32, 0);
for (size_t index = 0; index < size32; ++index) {
const auto input =
static_cast<uint32_t>(static_cast<uint8_t>(temp_buffer[index * 4]));
temp32[index] = little_to_native(input);
}
utf8_stream.str( conv::to_utf<char>(temp_buffer,"UTF-32"));
break;
}
case FileEncoding::UTF16_BE:{
const auto size16 = temp_buffer.length() / 2;
std::u16string temp16(size16, 0);
for (size_t index = 0; index < size16; ++index) {
const auto input =
static_cast<uint16_t>(static_cast<uint8_t>(temp_buffer[index * 2]));
temp16[index] = big_to_native(input);
}
utf8_stream.str( conv::to_utf<char>(temp_buffer,"UTF-16") );
break;
}
case FileEncoding::UTF16_LE:{
const auto size16 = temp_buffer.length() / 2;
std::u16string temp16(size16, 0);
for (size_t index = 0; index < size16; ++index) {
const auto input =
static_cast<uint16_t>(static_cast<uint8_t>(temp_buffer[index * 2]));
temp16[index] = little_to_native(input);
}
utf8_stream.str(conv::to_utf<char>(temp_buffer,"UTF-16"));
break;
}
case FileEncoding::ASCII:
utf8_stream.str(conv::to_utf<char>(temp_buffer,"ISO-8859-1"));
break;
case FileEncoding::UTF8:
default:
utf8_stream.str(temp_buffer);
break;
}
}
std::string A2lScanner::ReadA2ML() {
std::ostringstream a2ml_text;
a2ml_text << yytext;
std::string match;
constexpr std::string_view end_a2ml = "/endA2ML";
for (auto data = yyinput(); data != '\0'; data = yyinput()) {
a2ml_text << static_cast<char>(data);
if (std::isspace(data)) {
continue;
}
match.push_back(static_cast<char>(data));
if (match == end_a2ml) {
break;
}
while (match.size() >= end_a2ml.size()) {
match.erase(0,1);
}
}
return a2ml_text.str();
}
std::string A2lScanner::ReadIfData() {
std::ostringstream if_data_text;
if_data_text << yytext;
std::string match;
constexpr std::string_view end_if_data = "/endIF_DATA";
for (auto data = yyinput(); data != '\0'; data = yyinput()) {
if_data_text << static_cast<char>(data);
if (std::isspace(data)) {
continue;
}
match.push_back(static_cast<char>(data));
if (match == end_if_data) {
break;
}
while (match.size() >= end_if_data.size()) {
match.erase(0,1);
}
}
return if_data_text.str();
}
std::string A2lScanner::ReadIfDataSingleLine() {
std::ostringstream if_data_text;
if_data_text << "/begin " << yytext;
constexpr std::string_view end_if_data = "/endIF_DATA";
for (auto data = yyinput();
data != '\0' && data != '\n' && data != '\r';
data = yyinput()) {
if_data_text << static_cast<char>(data);
}
if_data_text << " " << end_if_data;
return if_data_text.str();
}
std::string A2lScanner::ReadIfDataMultiLine() {
std::ostringstream if_data_text;
if_data_text << "/begin IF_DATA";
constexpr std::string_view end_if_data = "/endIF_DATA";
int state = 0; // The state becomes -1 at end of string
for (auto data = yyinput(); data != '\0'; data = yyinput()) {
switch (data) {
case '{':
++state;
break;
case '}':
--state;
break;
default:
break;
}
if (state < 0) {
break;
}
if_data_text << static_cast<char>(data);
}
if_data_text << " " << end_if_data;
return if_data_text.str();
}
void A2lScanner::SkipUntil(char end_char) {
for (auto data = yyinput();
data != '\0' && data != end_char;
data = yyinput()) {
}
}
Module& A2lScanner::CurrentModule() {
if (!module_) {
module_ = std::make_unique<Module>();
}
return *module_;
}
AxisDescr& A2lScanner::CurrentAxisDescr() {
if (!axis_descr_) {
axis_descr_ = std::make_unique<AxisDescr>();
}
return *axis_descr_;
}
AxisPts& A2lScanner::CurrentAxisPts() {
if (!axis_pts_) {
axis_pts_ = std::make_unique<AxisPts>();
}
return *axis_pts_;
}
Blob& A2lScanner::CurrentBlob() {
if (!blob_) {
blob_ = std::make_unique<Blob>();
}
return *blob_;
}
Characteristic& A2lScanner::CurrentCharacteristic() {
if (!characteristic_) {
characteristic_ = std::make_unique<Characteristic>();
}
return *characteristic_;
}
CompuMethod& A2lScanner::CurrentCompuMethod() {
if (!compu_method_) {
compu_method_ = std::make_unique<CompuMethod>();
}
return *compu_method_;
}
CompuTab& A2lScanner::CurrentCompuTab() {
if (!compu_tab_) {
compu_tab_ = std::make_unique<CompuTab>();
}
return *compu_tab_;
}
CompuVtab& A2lScanner::CurrentCompuVtab() {
if (!compu_vtab_) {
compu_vtab_ = std::make_unique<CompuVtab>();
}
return *compu_vtab_;
}
CompuVtabRange& A2lScanner::CurrentCompuVtabRange() {
if (!compu_vtab_range_) {
compu_vtab_range_ = std::make_unique<CompuVtabRange>();
}
return *compu_vtab_range_;
}
Frame& A2lScanner::CurrentFrame() {
if (!frame_) {
frame_ = std::make_unique<Frame>();
}
return *frame_;
}
Function& A2lScanner::CurrentFunction() {
if (!function_) {
function_ = std::make_unique<Function>();
}
return *function_;
}
Group& A2lScanner::CurrentGroup() {
if (!group_) {
group_ = std::make_unique<Group>();
}
return *group_;
}
Instance& A2lScanner::CurrentInstance() {
if (!instance_) {
instance_ = std::make_unique<Instance>();
}
return *instance_;
}
Overwrite& A2lScanner::CurrentOverwrite() {
if (!overwrite_) {
overwrite_ = std::make_unique<Overwrite>();
}
return *overwrite_;
}
Measurement& A2lScanner::CurrentMeasurement() {
if (!measurement_) {
measurement_ = std::make_unique<Measurement>();
}
return *measurement_;
}
RecordLayout& A2lScanner::CurrentRecordLayout() {
if (!record_layout_) {
record_layout_ = std::make_unique<RecordLayout>();
}
return *record_layout_;
}
Transformer& A2lScanner::CurrentTransformer() {
if (!transformer_) {
transformer_ = std::make_unique<Transformer>();
}
return *transformer_;
}
AxisPts& A2lScanner::CurrentTypedefAxis() {
if (!typedef_axis_) {
typedef_axis_ = std::make_unique<AxisPts>();
}
return *typedef_axis_;
}
Blob& A2lScanner::CurrentTypedefBlob() {
if (!typedef_blob_) {
typedef_blob_ = std::make_unique<Blob>();
typedef_blob_->AddressType(A2lAddressType::DIRECT);
}
return *typedef_blob_;
}
Characteristic& A2lScanner::CurrentTypedefCharacteristic() {
if (!typedef_characteristic_) {
typedef_characteristic_ = std::make_unique<Characteristic>();
}
return *typedef_characteristic_;
}
Measurement& A2lScanner::CurrentTypedefMeasurement() {
if (!typedef_measurement_) {
typedef_measurement_ = std::make_unique<Measurement>();
}
return *typedef_measurement_;
}
Structure& A2lScanner::CurrentTypedefStructure() {
if (!typedef_structure_) {
typedef_structure_ = std::make_unique<Structure>();
}
return *typedef_structure_;
}
A2lStructureComponent& A2lScanner::CurrentStructureComponent() {
if (!structure_component_) {
structure_component_ = std::make_unique<A2lStructureComponent>();
}
return *structure_component_;
}
Unit& A2lScanner::CurrentUnit() {
if (!unit_) {
unit_ = std::make_unique<Unit>();
}
return *unit_;
}
A2lUserRight& A2lScanner::CurrentUserRight() {
if (!user_right_) {
user_right_ = std::make_unique<A2lUserRight>();
}
return *user_right_;
}
void A2lScanner::FixIncludeFile() {
// I shall read in "<file path>" but also <file_path> should work
// Skip white space and '"' characters
std::ostringstream file_path;
for (auto data = yyinput(); data != '\0' ; data = yyinput()) {
if (std::isspace(data)) {
continue;
}
if (data == '"') {
continue;
}
file_path << static_cast<char>(data);
break;
}
for (auto input = yyinput(); input != '\0' ; input = yyinput()) {
if (std::isspace(input)) {
break;
}
if (input == '"') {
break;
}
file_path << static_cast<char>(input);
}
std::string include_file;
std::string file_extension;
try {
const path fullname(file_path.str());
if (fullname.is_absolute() ) {
if (exists(fullname)) {
include_file = fullname.string();
file_extension = fullname.extension().string();
} else {
// File doesn't exists
std::ostringstream err;
err << "File doesn't exist. File: " << fullname;
throw std::runtime_error(err.str());
}
} else {
// Relative path assume the file should be relative the input_file
path input_file(InputFile()); // Current filename with path
input_file.replace_filename(fullname);
if (exists(input_file)) {
include_file = input_file.string();
file_extension = input_file.extension().string();
} else {
// File doesn't exists
std::ostringstream err;
err << "File doesn't exist. File: " << InputFile();
throw std::runtime_error(err.str());
}
}
}
catch (const std::exception& error) {
std::ostringstream err;
err << "Include file path error. Error: " << error.what() << ", File: " << file_path.str();
throw std::runtime_error(err.str());
}
// The included file exist but if the extension is A2L then
// it could be an existing A2L but the current parser already defined a
// PROJECT tag. To solve this try to parse the A2L file and if it succeeds,
// merge in that MODULE into the module list of the other project.
if (A2lHelper::stricmp(file_extension.c_str(), ".a2l") == 0) {
A2lFile temp_file;
temp_file.Filename(include_file);
const bool parse = temp_file.ParseFile();
if (parse && parent_ != nullptr) {
// Move the project to the original project
parent_->Merge(temp_file);
return;
}
// Continue with plan B that includes the file according to the standard.
}
// The include file exist. Store the current state and switch to the new file.
// Note that the <<EOF>> function in the lexer file will restore the state to
// the old one.
FileItem& current_item = file_stack_.back();
current_item.buffer_state = yy_buffer_stack[yy_buffer_stack_top];
// Switch to the include file
file_stack_.emplace_back(include_file);
auto& new_stack = file_stack_.back();
ReadAndConvertFile(new_stack.file, new_stack.utf8_stream);
new_stack.buffer_state = yy_create_buffer(new_stack.utf8_stream, 16384);
a2lFlexLexer::yy_switch_to_buffer(new_stack.buffer_state);
}
void A2lScanner::InputFile(std::string filename) {
if (!file_stack_.empty()) {
file_stack_.back().file = std::move(filename);
}
}
std::string A2lScanner::InputFile() const {
return file_stack_.empty() ? "" : file_stack_.back().file;
}
void A2lScanner::Parent(A2lFile *parent) {
parent_ = parent;
}
} // namespace a2l

231
TestLibDlg/IncSourceTestDlg/src/a2lscanner.h

@ -0,0 +1,231 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <fstream>
#include <string>
#include <memory>
#include <utility>
#include <vector>
#include <sstream>
#ifndef yyFlexLexerOnce
#undef yyFlexLexer
#define yyFlexLexer a2lFlexLexer
#include <FlexLexer.h>
#endif
#include <map>
#include <memory>
#include <sstream>
#include <vector>
#include "a2l/axisdescr.h"
#include "a2l/axispts.h"
#include "a2l/module.h"
#include "a2lparser.hpp"
#include "a2l/a2lfile.h"
namespace a2l {
class A2lFile;
class A2lScanner : public a2lFlexLexer {
public:
struct FileItem{
std::istringstream utf8_stream; ///< The file input converted to UTF8
yy_buffer_state *buffer_state = nullptr; ///< Needed when switching state
std::string file; ///< Filename including path.
explicit FileItem(std::string filename) :
file(std::move(filename)) {
}
};
explicit A2lScanner(std::istringstream& in);
int a2llex(A2lParser::value_type* yylval);
void InputFile( std::string filename);
[[nodiscard]] std::string InputFile() const;
void Parent(A2lFile* parent);
static void ReadAndConvertFile(const std::string& filename, std::istringstream& utf8_stream );
void LastError(const std::string& error) { last_error_ = error; }
[[nodiscard]] const std::string& LastError() const { return last_error_; }
Module& CurrentModule();
std::unique_ptr<Module>& ReleaseModule() { return module_; };
AxisDescr& CurrentAxisDescr();
std::unique_ptr<AxisDescr>& ReleaseAxisDescr() { return axis_descr_; };
AxisPts& CurrentAxisPts();
std::unique_ptr<AxisPts>& ReleaseAxisPts() { return axis_pts_; };
Blob& CurrentBlob();
std::unique_ptr<Blob>& ReleaseBlob() { return blob_; };
Characteristic& CurrentCharacteristic();
std::unique_ptr<Characteristic>& ReleaseCharacteristic() {
return characteristic_;
};
CompuMethod& CurrentCompuMethod();
std::unique_ptr<CompuMethod>& ReleaseCompuMethod() {
return compu_method_;
};
CompuTab& CurrentCompuTab();
std::unique_ptr<CompuTab>& ReleaseCompuTab() {
return compu_tab_;
};
CompuVtab& CurrentCompuVtab();
std::unique_ptr<CompuVtab>& ReleaseCompuVtab() {
return compu_vtab_;
};
CompuVtabRange& CurrentCompuVtabRange();
std::unique_ptr<CompuVtabRange>& ReleaseCompuVtabRange() {
return compu_vtab_range_;
};
Frame& CurrentFrame();
std::unique_ptr<Frame>& ReleaseFrame() {
return frame_;
};
Function& CurrentFunction();
std::unique_ptr<Function>& ReleaseFunction() {
return function_;
};
Group& CurrentGroup();
std::unique_ptr<Group>& ReleaseGroup() {
return group_;
};
Instance& CurrentInstance();
std::unique_ptr<Instance>& ReleaseInstance() {
return instance_;
};
Overwrite& CurrentOverwrite();
std::unique_ptr<Overwrite>& ReleaseOverwrite() {
return overwrite_;
};
Measurement& CurrentMeasurement();
std::unique_ptr<Measurement>& ReleaseMeasurement() {
return measurement_;
};
A2lBitOperation& CurrentBitOperation() { return bit_operation_; };
RecordLayout& CurrentRecordLayout();
std::unique_ptr<RecordLayout>& ReleaseRecordLayout() {
return record_layout_;
};
Transformer& CurrentTransformer();
std::unique_ptr<Transformer>& ReleaseTransformer() {
return transformer_;
};
AxisPts& CurrentTypedefAxis();
std::unique_ptr<AxisPts>& ReleaseTypedefAxis() {
return typedef_axis_;
};
Blob& CurrentTypedefBlob();
std::unique_ptr<Blob>& ReleaseTypedefBlob() {
return typedef_blob_;
};
Characteristic& CurrentTypedefCharacteristic();
std::unique_ptr<Characteristic>& ReleaseTypedefCharacteristic() {
return typedef_characteristic_;
};
Measurement& CurrentTypedefMeasurement();
std::unique_ptr<Measurement>& ReleaseTypedefMeasurement() {
return typedef_measurement_;
};
Structure& CurrentTypedefStructure();
std::unique_ptr<Structure>& ReleaseTypedefStructure() {
return typedef_structure_;
};
A2lStructureComponent& CurrentStructureComponent();
std::unique_ptr<A2lStructureComponent>& ReleaseStructureComponent() {
return structure_component_;
};
Unit& CurrentUnit();
std::unique_ptr<Unit>& ReleaseUnit() {
return unit_;
};
A2lUserRight& CurrentUserRight();
std::unique_ptr<A2lUserRight>& ReleaseUserRight() {
return user_right_;
};
A2lVarCriterion& VarCriterion() { return var_criterion_; };
[[nodiscard]] bool IsA2lFile() const { return found_; }
private:
std::vector<FileItem> file_stack_; ///< The file stack is main purpose is for include files handling
A2lParser::semantic_type* yylval = nullptr;
A2lFile* parent_ = nullptr; ///< Parent is needed if I must merge an A2L file.
std::string last_error_;
bool found_ = false; ///< Indicate that the PROJECT tag has been found in the file.
std::string ReadA2ML();
std::string ReadIfData();
std::string ReadIfDataSingleLine();
std::string ReadIfDataMultiLine();
std::unique_ptr<Module> module_; ///< Current module
std::unique_ptr<AxisDescr> axis_descr_; ///< Current axis descr
std::unique_ptr<AxisPts> axis_pts_; ///< Current axis pts
std::unique_ptr<Blob> blob_; ///< Current blob
std::unique_ptr<Characteristic> characteristic_; ///< Current characteristic
std::unique_ptr<CompuMethod> compu_method_; ///< Current Compu Method
std::unique_ptr<CompuTab> compu_tab_; ///< Current COMPU TAB
std::unique_ptr<CompuVtab> compu_vtab_; ///< Current COMPU VTAB
std::unique_ptr<CompuVtabRange> compu_vtab_range_; ///< Current VTAB Range
std::unique_ptr<Frame> frame_; ///< Current Frame
std::unique_ptr<Function> function_; ///< Current Function
std::unique_ptr<Group> group_;
std::unique_ptr<Instance> instance_;
std::unique_ptr<Overwrite> overwrite_;
std::unique_ptr<Measurement> measurement_;
A2lBitOperation bit_operation_ = {};
std::unique_ptr<RecordLayout> record_layout_;
std::unique_ptr<Transformer> transformer_;
std::unique_ptr<AxisPts> typedef_axis_;
std::unique_ptr<Blob> typedef_blob_;
std::unique_ptr<Characteristic> typedef_characteristic_;
std::unique_ptr<Measurement> typedef_measurement_;
std::unique_ptr<Structure> typedef_structure_;
std::unique_ptr<A2lStructureComponent> structure_component_;
std::unique_ptr<Unit> unit_;
std::unique_ptr<A2lUserRight> user_right_;
A2lVarCriterion var_criterion_ = {};
void SkipUntil(char end_char);
void FixIncludeFile();
};
} // namespace a2l

30
TestLibDlg/IncSourceTestDlg/src/a2mlblock.cpp

@ -0,0 +1,30 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/a2mlblock.h"
#include <sstream>
#include "a2mlscanner.h"
#include "a2mlparser.hpp"
namespace a2l {
A2mlBlock::A2mlBlock(const std::string& a2ml) {
try {
if (a2ml.empty()) {
throw std::runtime_error("Nothing to parse");
}
std::istringstream temp(a2ml);
A2mlScanner scanner(temp);
A2mlParser parser(scanner);
parse_ = parser.parse() == 0;
last_error_ = scanner.LastError();
block_list_ = scanner.BlockList();
} catch (const std::exception& err) {
last_error_ = err.what();
parse_ = false;
}
}
} // namespace a2l

2311
TestLibDlg/IncSourceTestDlg/src/a2mlflexer.cpp

File diff suppressed because it is too large

162
TestLibDlg/IncSourceTestDlg/src/a2mlflexer.l

@ -0,0 +1,162 @@
%top {
#include <cstdint>
#include <cctype>
}
%{
#include "a2mlscanner.h"
#undef YY_DECL
#define YY_DECL int a2l::A2mlScanner::a2mllex(a2l::A2mlParser::value_type* yy_value)
using token = a2l::A2mlParser::token;
%}
%option prefix="a2ml"
%option 8bit
%option nounistd
%option noyywrap
%option debug
%option never-interactive
%option c++
%option yyclass="a2l:A2mlScanner"
%option yylineno
%option noinput
%option nounput
ws [ \t\n\v\f\r]+
signed_number [-+]?[0-9]+
unsigned_number [0-9]+
hexnumber 0x[0-9a-fA-F]+
float_val [-+]?[0-9]+(\.[0-9]*)?([eE][-+]?[0-9]+)?
ident [a-zA-Z_]([_a-zA-Z0-9.-]*)?
string (\"(\\.|[^\\"])*\")*
/* \"([^\"\\]|(\\.))*\" */
nl [\n\r]
keyword [A-Z_0-9]+
text_array ("char[")[0-9]+("]")
%%
%{
yylval = yy_value;
%}
"A2ML" { return token::A2ML; }
"/begin" { return token::A2ML_BEGIN; }
"/end" { return token::A2ML_END; }
{text_array} { return token::TEXT_ARRAY; }
"(" { return token::MEM_BEGIN; }
")*" { return token::MEM_END; }
") *" { return token::MEM_END; }
"block" { return token::BLOCK; }
"taggedunion" { return token::TAGGED_UNION; }
"taggedstruct" { return token::TAGGED_STRUCT; }
"{" { return token::BLOCK_BEGIN; }
"}" { return token::BLOCK_END; }
"[" { return token::ARRAY_BEGIN; }
"]" { return token::ARRAY_END; }
";" { return token::DEF_END; }
"=" { return token::EQUAL; }
"struct" { return token::STRUCT; }
"char" { return token::CHAR; }
"int" { return token::INT; }
"long" { return token::LONG; }
"int64" { return token::INT64; }
"uchar" { return token::UCHAR; }
"uint" { return token::UINT; }
"uint64" { return token::UINT64; }
"ulong" { return token::ULONG; }
"double" { return token::DOUBLE; }
"float" { return token::FLOAT; }
"enum" { return token::ENUM; }
{ident} {
std::string temp(yytext);
if (yylval != nullptr) {
yylval->emplace<std::string>(temp);
}
return token::IDENT;
}
{string} {
const size_t len = strlen(yytext);
std::string temp;
if (len > 2) {
temp = yytext + 1;
temp.pop_back();
}
yylval->emplace<std::string>(temp);
return token::STRING;
}
{signed_number} {
int64_t temp = 0;
try {
temp = std::stoll(yytext);
} catch (const std::exception& ) {
}
yylval->emplace<int64_t>(temp);
return token::CONSTANT;
}
{hexnumber} {
uint64_t address = 0;
for ( size_t index = 0; yytext[ index ] != '\0'; ++index ) {
if ( index < 2 ) continue;
const char token = yytext[index];
switch ( token ) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
address *= 16;
address += token - '0';
break;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
address *= 16;
address += token - 'A' + 10;
break;
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
address *= 16;
address += token - 'a' + 10;
break;
default:
break;
}
}
yylval->emplace<int64_t>(static_cast<int64_t>(address));
return token::CONSTANT;
}
[/][*][^*]*[*]+([^*/][^*]*[*]+)*[/] { } /* Multi line comments */
"//".* { /* Single line comment */ }
{ws} {}
. {}
%%

102
TestLibDlg/IncSourceTestDlg/src/a2mlobject.cpp

@ -0,0 +1,102 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/a2mlobject.h"
#include <sstream>
#include <string_view>
namespace a2l {
A2mlObject::A2mlObject(A2mlTypeName type)
: type_(type) {
}
std::string_view A2mlObject::TypeAsString() const {
switch (type_) {
case A2mlTypeName::PREDEFINED: return "PREDEFINED";
case A2mlTypeName::STRUCT: return "STRUCT";
case A2mlTypeName::TAGGED_STRUCT: return "TAGGED STRUCT";
case A2mlTypeName::TAGGED_UNION: return "TAGGED UNION";
case A2mlTypeName::ENUMERATE: return "ENUMERATE";
case A2mlTypeName::BLOCK: return "BLOCK";
default:
break;
}
return "";
}
std::string_view A2mlObject::DataTypeAsString() const {
switch (data_type_) {
case A2mlDataType::CHAR: return "char";
case A2mlDataType::INT: return "int";
case A2mlDataType::LONG: return "long";
case A2mlDataType::INT64: return "int64";
case A2mlDataType::UCHAR: return "uchar";
case A2mlDataType::UINT: return "uint";
case A2mlDataType::ULONG: return "ulong";
case A2mlDataType::UINT64: return "uint64";
case A2mlDataType::DOUBLE: return "double";
case A2mlDataType::FLOAT: return "float";
case A2mlDataType::TEXT_ARRAY: return "string";
default:
break;
}
return {};
}
std::string A2mlObject::AsString() const {
std::ostringstream temp;
switch (type_) {
case A2mlTypeName::PREDEFINED:
if (!tag_.empty()) {
temp << "\"" << tag_ << "\"" << " ";
}
if (!ident_.empty()) {
temp << ident_ << " ";
}
temp << DataTypeAsString();
break;
case A2mlTypeName::ENUMERATE:
temp << TypeAsString() << " ";
if (!tag_.empty()) {
temp << "\"" << tag_ << "\"" << " ";
}
if (!ident_.empty()) {
temp << ident_ << " ";
}
if (!enumerate_list_.empty()) {
temp << DataTypeAsString() << " {" << std::endl;
for (const auto& [key, value] : enumerate_list_) {
temp << value << " = " << key << std::endl;
}
temp << "}";
}
break;
default:
temp << TypeAsString() << " ";
if (!tag_.empty()) {
temp << "\"" << tag_ << "\"" << " ";
}
if (!ident_.empty()) {
temp << ident_ << " ";
}
if (!member_list_.empty()) {
temp << "{" << std::endl;
for (const auto& object : member_list_) {
temp << object.AsString();
}
temp << "}";
}
break;
}
temp << std::endl;
return temp.str();
}
} // namespace a2l

1905
TestLibDlg/IncSourceTestDlg/src/a2mlparser.cpp

File diff suppressed because it is too large

1875
TestLibDlg/IncSourceTestDlg/src/a2mlparser.hpp

File diff suppressed because it is too large

326
TestLibDlg/IncSourceTestDlg/src/a2mlparser.y

@ -0,0 +1,326 @@
%require "3.2"
%language "c++"
%define api.prefix {a2ml}
%define api.namespace {a2l}
%define api.parser.class {A2mlParser}
%code requires {
#include <string>
#include <vector>
#include <map>
#include <utility>
#include "a2l/a2mlobject.h"
namespace a2l {
class A2mlScanner;
}
}
%parse-param { a2l::A2mlScanner &scanner }
%code {
#include <sstream>
#include "a2mlscanner.h"
#include "a2lhelper.h"
#include <limits>
#undef yylex
#define yylex scanner.a2mllex
}
%define api.value.type variant
%token A2ML_BEGIN
%token A2ML_END
%token A2ML
%token ARRAY_BEGIN
%token ARRAY_END
%token BLOCK
%token BLOCK_BEGIN
%token BLOCK_END
%token CHAR
%token <int64_t> CONSTANT
%token DEF_END
%token DOUBLE
%token ENUM
%token EQUAL
%token <double> FLOAT
%token <std::string> IDENT
%token IF_DATA
%token INT
%token INT64
%token LONG
%token MEM_BEGIN
%token MEM_END
%token <std::string> STRING
%token STRUCT
%token TAGGED_STRUCT
%token TAGGED_UNION
%token TEXT_ARRAY
%token UCHAR
%token UINT
%token UINT64
%token ULONG
%nterm <std::pair<int64_t, std::string>> enumerator
%nterm <a2l::A2mlEnumerateList> enumerator_list
%nterm <std::string> identifier
%nterm <std::string> keyword
%nterm <a2l::A2mlDataType> predefined_type_name
%nterm <std::string> tag
%nterm <a2l::A2mlObject> type_name
%nterm <a2l::A2mlObject> type_definition
%nterm <a2l::A2mlObject> block_definition
%nterm <a2l::A2mlObject> enum_type_name
%nterm <a2l::A2mlObject> struct_type_name
%nterm <a2l::A2mlObject> member
%nterm <a2l::A2mlMemberList> struct_member_list
%nterm <a2l::A2mlObject> struct_member
%nterm <a2l::A2mlObject> taggedstruct_type_name
%nterm <a2l::A2mlMemberList> taggedstruct_member_list
%nterm <a2l::A2mlObject> taggedstruct_member
%nterm <a2l::A2mlObject> taggedstruct_definition
%nterm <a2l::A2mlObject> taggedunion_type_name
%nterm <a2l::A2mlMemberList> taggedunion_member_list
%nterm <a2l::A2mlObject> taggedunion_member
%nterm <a2l::A2mlObject> declaration
%nterm <a2l::A2mlMemberList> declaration_list
%start a2ml_block
%%
a2ml_block: %empty
| A2ML_BEGIN A2ML declaration_list A2ML_END A2ML {
scanner.BlockList($3);
};
declaration_list: declaration {
$$ = A2mlMemberList();
$$.emplace_back($1);
}
| declaration_list declaration {
$$ = $1;
$$.emplace_back($2);
};
declaration: type_definition DEF_END { $$ = $1; }
| block_definition DEF_END { $$ = $1; };
type_definition: type_name { $$ = $1;};
type_name : predefined_type_name {
$$ = A2mlObject(A2mlTypeName::PREDEFINED);
$$.DataType($1);
}
| struct_type_name {
$$ = $1;
}
| taggedstruct_type_name {
$$ = $1;
}
| taggedunion_type_name {
$$ = $1;
}
| enum_type_name {
$$ = $1;
};
predefined_type_name: CHAR { $$ = A2mlDataType::CHAR;}
| INT { $$ = A2mlDataType::INT;}
| LONG { $$ = A2mlDataType::LONG;}
| INT64 { $$ = A2mlDataType::INT64;}
| UCHAR { $$ = A2mlDataType::UCHAR;}
| UINT { $$ = A2mlDataType::UINT;}
| UINT64 { $$ = A2mlDataType::UINT64;}
| ULONG { $$ = A2mlDataType::ULONG;}
| DOUBLE { $$ = A2mlDataType::DOUBLE;}
| FLOAT { $$ = A2mlDataType::FLOAT;}
| TEXT_ARRAY { $$ = A2mlDataType::TEXT_ARRAY;};
block_definition: BLOCK tag member {
$$ = A2mlObject(A2mlTypeName::BLOCK);
$$.Tag($2);
$$.MemberList().emplace_back($3);
}
| BLOCK tag MEM_BEGIN member MEM_END {
$$ = A2mlObject(A2mlTypeName::BLOCK);
$$.Tag($2);
$$.MemberList().emplace_back($4);
};
enum_type_name : ENUM identifier BLOCK_BEGIN enumerator_list BLOCK_END {
$$ = A2mlObject(A2mlTypeName::ENUMERATE);
$$.Ident($2);
$$.EnumerateList($4);
}
| ENUM IDENT {
$$ = A2mlObject(A2mlTypeName::ENUMERATE);
$$.Ident($2);
};
enumerator_list: enumerator {
A2mlEnumerateList list;
auto& enumerator = $1;
const auto itr = list.find(enumerator.first);
if (itr == list.cend() ) {
list.emplace(enumerator.first, enumerator.second);
} else {
// Change key
auto key = list.rbegin()->first;
++key;
list.emplace(key, enumerator.second);
}
$$ = list;
}
| enumerator_list enumerator {
auto& list = $1;
auto& enumerator = $2;
const auto itr = list.find(enumerator.first);
if (itr == list.cend() ) {
list.emplace(enumerator.first, enumerator.second);
} else {
// Change key
auto key = list.rbegin()->first;
++key;
list.emplace(key, enumerator.second);
}
$$ = list;
};
enumerator: keyword {
$$.first = 0;
$$.second = $1;
}
| keyword EQUAL CONSTANT {
$$.first = $3;
$$.second = $1;
};
struct_type_name: STRUCT identifier BLOCK_BEGIN struct_member_list BLOCK_END {
$$ = A2mlObject(A2mlTypeName::STRUCT);
$$.Ident($2);
$$.MemberList($4);
}
| STRUCT IDENT {
$$ = A2mlObject(A2mlTypeName::STRUCT);
$$.Ident($2);
};
struct_member_list: %empty {}
| struct_member_list struct_member {
$$ = $1;
$$.emplace_back($2);
};
struct_member: member DEF_END {
$$ = $1;
}
| MEM_BEGIN member MEM_END DEF_END {
$$ = $2;
};
member: type_name array_specifier {
$$ = $1;
// Todo Array specifier
};
array_specifier: %empty
| array_specifier ARRAY_BEGIN CONSTANT ARRAY_END;
taggedstruct_type_name: TAGGED_STRUCT identifier BLOCK_BEGIN taggedstruct_member_list BLOCK_END {
$$ = A2mlObject(A2mlTypeName::TAGGED_STRUCT);
$$.Ident($2);
$$.MemberList($4);
}
| TAGGED_STRUCT IDENT {
$$ = A2mlObject(A2mlTypeName::TAGGED_STRUCT);
$$.Ident($2);
};
taggedstruct_member_list: taggedstruct_member {
$$ = A2mlMemberList();
$$.emplace_back($1);
}
| taggedstruct_member_list taggedstruct_member {
$$ = $1;
$$.emplace_back($2);
};
taggedstruct_member: taggedstruct_definition DEF_END { $$ = $1; }
| MEM_BEGIN taggedstruct_definition MEM_END DEF_END { $$ = $2; }
| block_definition DEF_END {$$ = $1;}
| MEM_BEGIN block_definition MEM_END DEF_END { $$ = $2;};
taggedstruct_definition: tag {
$$ = A2mlObject(A2mlTypeName::UNKNOWN);
$$.Tag($1);
}
| tag member {
$$ = $2;
$$.Tag($1);
}
| tag MEM_BEGIN member MEM_END {
$$ = $3;
$$.Tag($1);
};
taggedunion_type_name: TAGGED_UNION identifier BLOCK_BEGIN taggedunion_member_list BLOCK_END {
$$ = A2mlObject(A2mlTypeName::TAGGED_UNION);
$$.Ident($2);
$$.MemberList( $4);
}
| TAGGED_UNION IDENT {
$$ = A2mlObject(A2mlTypeName::TAGGED_UNION);
$$.Ident($2);
};
taggedunion_member_list: taggedunion_member {
$$ = A2mlMemberList();
$$.emplace_back($1);
}
| taggedunion_member_list taggedunion_member {
$$ = $1;
$$.emplace_back($2);
};
taggedunion_member: tag DEF_END {
$$ = A2mlObject(A2mlTypeName::UNKNOWN);
$$.Tag($1);
}
| tag member DEF_END {
$$ = $2;
$$.Tag($1);
}
| block_definition DEF_END {
$$ = $1;
};
keyword : STRING { $$ = $1; };
identifier: %empty {}
| IDENT { $$ = $1; };
tag: STRING { $$ = $1; };
%%
void a2l::A2mlParser::error(const std::string& err) {
const auto line = scanner.lineno();
// const auto column = scanner.YYLeng();
const std::string near = scanner.YYText() != nullptr ? scanner.YYText() : "";
std::ostringstream error;
error << "Parser error: " << err
<< ", Line: " << line
<< ", Near: " << near;
scanner.LastError(error.str());
}

16
TestLibDlg/IncSourceTestDlg/src/a2mlscanner.cpp

@ -0,0 +1,16 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2mlscanner.h"
namespace a2l {
A2mlScanner::A2mlScanner(std::istream& message)
: a2mlFlexLexer(&message), yylval(nullptr) {
}
} // namespace a2l

50
TestLibDlg/IncSourceTestDlg/src/a2mlscanner.h

@ -0,0 +1,50 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <fstream>
#include <string>
#include <memory>
#ifndef yyFlexLexerOnce
#undef yyFlexLexer
#define yyFlexLexer a2mlFlexLexer
#include <FlexLexer.h>
#endif
#include <map>
#include <memory>
#include <sstream>
#include <vector>
#include <stack>
#include "a2mlparser.hpp"
#include "a2l/a2mlobject.h"
namespace a2l {
class A2mlScanner : public a2mlFlexLexer {
public:
explicit A2mlScanner(std::istream& in);
int a2mllex(A2mlParser::value_type* yylval);
void LastError(const std::string& error) { last_error_ = error; }
[[nodiscard]] const std::string& LastError() const { return last_error_; }
void BlockList(const A2mlBlockList& list) { block_list_ = list; }
[[nodiscard]] const A2mlBlockList& BlockList() const { return block_list_; }
private:
A2mlParser::semantic_type* yylval = nullptr;
std::string last_error_;
std::vector<A2mlObject> block_list_;
};
} // namespace a2l

10
TestLibDlg/IncSourceTestDlg/src/axisdescr.cpp

@ -0,0 +1,10 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/axisdescr.h"
namespace a2l {
} // end namespace a2l

8
TestLibDlg/IncSourceTestDlg/src/axispts.cpp

@ -0,0 +1,8 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/axispts.h"
namespace a2l {} // namespace a2l

10
TestLibDlg/IncSourceTestDlg/src/blob.cpp

@ -0,0 +1,10 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/blob.h"
namespace a2l {
} // end namespace a2l

12
TestLibDlg/IncSourceTestDlg/src/characteristic.cpp

@ -0,0 +1,12 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/characteristic.h"
namespace a2l {
void Characteristic::AddAxisDescr(std::unique_ptr<AxisDescr>& axis_descr) {
axis_descr_list_.emplace_back( std::move(axis_descr));
}
} // end namespace a2l

10
TestLibDlg/IncSourceTestDlg/src/compumethod.cpp

@ -0,0 +1,10 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/compumethod.h"
namespace a2l {
} // end namespace a2l

28
TestLibDlg/IncSourceTestDlg/src/computab.cpp

@ -0,0 +1,28 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/computab.h"
namespace a2l {
void CompuTab::DefaultValue(const std::string& value) {
default_value_ = value;
if (default_value_numeric_ == 0.0) {
try {
default_value_numeric_ = std::stod(value);
} catch (const std::exception& ) {}
}
}
void CompuTab::DefaultValueNumeric(double value) {
default_value_numeric_ = value;
if (default_value_.empty()) {
try {
default_value_ = std::to_string(default_value_numeric_);
} catch (const std::exception&) {}
}
}
} // end namespace a2l

10
TestLibDlg/IncSourceTestDlg/src/compuvtab.cpp

@ -0,0 +1,10 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/compuvtab.h"
namespace a2l {
} // end namespace a2l

10
TestLibDlg/IncSourceTestDlg/src/compuvtabrange.cpp

@ -0,0 +1,10 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/compuvtabrange.h"
namespace a2l {
} // end namespace a2l

10
TestLibDlg/IncSourceTestDlg/src/frame.cpp

@ -0,0 +1,10 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/frame.h"
namespace a2l {
} // end namespace a2l

3
TestLibDlg/IncSourceTestDlg/src/function.cpp

@ -0,0 +1,3 @@
//
// Created by ihedv on 2023-08-29.
//

10
TestLibDlg/IncSourceTestDlg/src/group.cpp

@ -0,0 +1,10 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/group.h"
namespace a2l {
} // end namespace a2l

69
TestLibDlg/IncSourceTestDlg/src/ifdatablock.cpp

@ -0,0 +1,69 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/ifdatablock.h"
#include <sstream>
#include "ifdatascanner.h"
#include "ifdataparser.hpp"
namespace a2l {
IfDataBlock::IfDataBlock(const std::string& ifdata) {
try {
if (ifdata.empty()) {
throw std::runtime_error("Nothing to parse");
}
std::istringstream temp(ifdata);
IfDataScanner scanner(temp);
IfDataParser parser(scanner);
parse_ = parser.parse() == 0;
last_error_ = scanner.LastError();
protocol_ = scanner.Protocol();
item_list_ = scanner.ItemList();
} catch (const std::exception& err) {
last_error_ = err.what();
parse_ = false;
}
}
std::string IfDataBlock::AsString() const {
std::ostringstream temp;
temp << Protocol() << std::endl;
for (const auto& item : item_list_) {
if (item.BlockName.empty() && item.ItemList.empty()) {
temp << "\t" << item.Value << std::endl;
} else {
temp << AsString(1,item);
}
}
temp << std::endl;
return temp.str();
}
std::string IfDataBlock::AsString(size_t tab_level, // NOLINT
const IfDataItem& block_item) const {
std::ostringstream temp;
for (size_t level1 = 0; level1 < tab_level; ++level1 ) {
temp << "\t";
}
temp << block_item.BlockName << std::endl;
for (const auto& item : block_item.ItemList) {
if (item.BlockName.empty() && item.ItemList.empty()) {
for (size_t level1 = 0; level1 < tab_level; ++level1 ) {
temp << "\t";
}
temp << "\t" << item.Value << std::endl;
} else {
temp << AsString(tab_level + 1,item);
}
}
temp << std::endl;
return temp.str();
}
} // namespace a2l

2158
TestLibDlg/IncSourceTestDlg/src/ifdataflexer.cpp

File diff suppressed because it is too large

149
TestLibDlg/IncSourceTestDlg/src/ifdataflexer.l

@ -0,0 +1,149 @@
%top {
#include <cstdint>
#include <cctype>
}
%{
#include "ifdatascanner.h"
#undef YY_DECL
#define YY_DECL int a2l::IfDataScanner::ifdatalex(a2l::IfDataParser::value_type* yy_value)
using token = a2l::IfDataParser::token;
%}
%option prefix="ifdata"
%option 8bit
%option nounistd
%option noyywrap
%option debug
%option never-interactive
%option c++
%option yyclass="a2l:IfDataScanner"
%option yylineno
%option noinput
%option nounput
ws [ \t\n\v\f\r]+
signed_number [-+]?[0-9]+
unsigned_number [0-9]+
hexnumber 0x[0-9a-fA-F]+
float_val [-+]?[0-9]+(\.[0-9]*)?([eE][-+]?[0-9]+)?
ident [a-zA-Z_]([_a-zA-Z0-9.-]*)?
string (\"(\\.|[^\\"])*\")*
/* \"([^\"\\]|(\\.))*\" */
nl [\n\r]
keyword [A-Z_0-9]+
%%
%{
yylval = yy_value;
%}
"/begin" { return token::IF_DATA_BEGIN; }
"/end" { return token::IF_DATA_END; }
"IF_DATA" { return token::IF_DATA; }
{ident} {
if (yylval != nullptr) {
std::string temp(yytext);
yylval->emplace<std::string>(temp);
}
return token::IDENT;
}
{string} {
const size_t len = strlen(yytext);
std::string temp;
if (len > 2) {
temp = yytext + 1;
temp.pop_back();
}
yylval->emplace<std::string>(temp);
return token::STRING;
}
{hexnumber} {
uint64_t address = 0;
for ( size_t index = 0; yytext[ index ] != '\0'; ++index ) {
if ( index < 2 ) continue;
const char token = yytext[index];
switch ( token ) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
address *= 16;
address += token - '0';
break;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
address *= 16;
address += token - 'A' + 10;
break;
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
address *= 16;
address += token - 'a' + 10;
break;
default:
break;
}
}
yylval->emplace<uint64_t>(address);
return token::HEX;
}
{unsigned_number} {
uint64_t temp = 0;
try {
temp = std::stoull(yytext);
} catch (const std::exception& ) {
}
yylval->emplace<uint64_t>(temp);
return token::UINT;
}
{signed_number} {
int64_t temp = 0;
try {
temp = std::stoll(yytext);
} catch (const std::exception& ) {
}
yylval->emplace<int64_t>(temp);
return token::INT;
}
{float_val} {
double temp = 0.0;
try {
temp = std::stod(yytext);
} catch (const std::exception&) {
}
yylval->emplace<double>(temp);
return token::FLOAT;
}
[/][*][^*]*[*]+([^*/][^*]*[*]+)*[/] { } /* Multi line comments */
"//".* { /* Single line comment */ }
{ws} {}
. {}
%%

1309
TestLibDlg/IncSourceTestDlg/src/ifdataparser.cpp

File diff suppressed because it is too large

1406
TestLibDlg/IncSourceTestDlg/src/ifdataparser.hpp

File diff suppressed because it is too large

121
TestLibDlg/IncSourceTestDlg/src/ifdataparser.y

@ -0,0 +1,121 @@
%require "3.2"
%language "c++"
%define api.prefix {ifdata}
%define api.namespace {a2l}
%define api.parser.class {IfDataParser}
%code requires {
#include <string>
#include <vector>
#include <map>
#include <utility>
#include "a2l/ifdataitem.h"
namespace a2l {
class IfDataScanner;
}
}
%parse-param { a2l::IfDataScanner &scanner }
%code {
#include <sstream>
#include "ifdatascanner.h"
#include "a2lhelper.h"
#include <limits>
#undef yylex
#define yylex scanner.ifdatalex
}
%define api.value.type variant
%token IF_DATA_BEGIN
%token IF_DATA_END
%token <uint64_t> UINT
%token <uint64_t> HEX
%token <int64_t> INT
%token <double> FLOAT
%token <std::string> IDENT
%token IF_DATA
%token <std::string> STRING
%nterm <std::string> protocol
%nterm <std::vector<a2l::IfDataItem>> block_data_list
%nterm <a2l::IfDataItem> block_data
%nterm <std::string> item_value
%nterm <std::string> block_name
%nterm <std::vector<a2l::IfDataItem>> item_list
%start if_data_block
%%
if_data_block: %empty
| IF_DATA_BEGIN IF_DATA protocol block_data_list IF_DATA_END IF_DATA {
scanner.Protocol($3);
scanner.ItemList($4);
};
protocol: IDENT;
block_data_list: %empty {}
| block_data_list block_data {
$$ = $1;
$$.emplace_back($2);
}
| block_data_list item_value {
$$ = $1;
IfDataItem item;
item.Value = $2;
$$.emplace_back($2);
};
block_data: IF_DATA_BEGIN block_name item_list IF_DATA_END block_name {
IfDataItem block;
block.BlockName = $2;
block.ItemList = $3;
$$ = block;
};
block_name: IDENT { $$ = $1; };
item_list: %empty {}
| item_list block_data {
$$ = $1;
$$.emplace_back($2);
}
| item_list item_value {
$$ = $1;
IfDataItem item;
item.Value = $2;
$$.emplace_back($2);
};
item_value: IDENT { $$ = $1; }
| STRING { $$ = $1; }
| HEX { $$ = std::to_string($1); }
| UINT { $$ = std::to_string($1); }
| INT { $$ = std::to_string($1); }
| FLOAT { $$ = std::to_string($1); };
%%
void a2l::IfDataParser::error(const std::string& err) {
const auto line = scanner.lineno();
// const auto column = scanner.YYLeng();
const std::string near = scanner.YYText() != nullptr ? scanner.YYText() : "";
std::ostringstream error;
error << "Parser error: " << err
<< ", Line: " << line
<< ", Near: " << near;
scanner.LastError(error.str());
}

16
TestLibDlg/IncSourceTestDlg/src/ifdatascanner.cpp

@ -0,0 +1,16 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "ifdatascanner.h"
namespace a2l {
IfDataScanner::IfDataScanner(std::istream& message)
: ifdataFlexLexer(&message), yylval(nullptr) {
}
} // namespace a2l

55
TestLibDlg/IncSourceTestDlg/src/ifdatascanner.h

@ -0,0 +1,55 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <fstream>
#include <string>
#include <memory>
#ifndef yyFlexLexerOnce
#undef yyFlexLexer
#define yyFlexLexer ifdataFlexLexer
#include <FlexLexer.h>
#endif
#include <map>
#include <memory>
#include <sstream>
#include <vector>
#include <stack>
#include "ifdataparser.hpp"
#include "a2l/ifdataitem.h"
namespace a2l {
class IfDataScanner : public ifdataFlexLexer {
public:
explicit IfDataScanner(std::istream& in);
int ifdatalex(IfDataParser::value_type* yylval);
void LastError(const std::string& error) { last_error_ = error; }
[[nodiscard]] const std::string& LastError() const { return last_error_; }
void Protocol(const std::string& protocol) { protocol_ = protocol; }
[[nodiscard]] const std::string& Protocol() const { return protocol_; }
void ItemList(const std::vector<IfDataItem>& list) { item_list_ = list; }
[[nodiscard]] const std::vector<IfDataItem>& ItemList() const {
return item_list_;
}
private:
IfDataParser::semantic_type* yylval = nullptr;
std::string last_error_;
std::string protocol_;
std::vector<IfDataItem> item_list_;
};
} // namespace a2l

12
TestLibDlg/IncSourceTestDlg/src/instance.cpp

@ -0,0 +1,12 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/instance.h"
namespace a2l {
void Instance::AddOverwrite(std::unique_ptr<Overwrite>& overwrite) {
overwrite_list_.emplace_back( std::move(overwrite) );
}
}

13
TestLibDlg/IncSourceTestDlg/src/measurement.cpp

@ -0,0 +1,13 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/measurement.h"
namespace a2l {
}

159
TestLibDlg/IncSourceTestDlg/src/module.cpp

@ -0,0 +1,159 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/module.h"
namespace a2l {
void Module::AddAxisPts(std::unique_ptr<AxisPts>& axis_pts) {
axis_pts_list_.emplace(axis_pts->Name(), std::move(axis_pts));
}
void Module::AddBlob(std::unique_ptr<Blob>& blob) {
blob_list_.emplace(blob->Name(), std::move(blob));
}
void Module::AddCharacteristic(std::unique_ptr<Characteristic>&
characteristic) {
characteristic_list_.emplace(characteristic->Name(),
std::move(characteristic));
}
void Module::AddCompuMethod(std::unique_ptr<CompuMethod>& method) {
compu_method_list_.emplace(method->Name(), std::move(method));
}
void Module::AddCompuTab(std::unique_ptr<CompuTab>& tab) {
compu_tab_list_.emplace(tab->Name(), std::move(tab));
}
void Module::AddCompuVtab(std::unique_ptr<CompuVtab>& tab) {
compu_vtab_list_.emplace(tab->Name(), std::move(tab));
}
void Module::AddCompuVtabRange(std::unique_ptr<CompuVtabRange>& tab) {
compu_vtab_range_list_.emplace(tab->Name(), std::move(tab));
}
void Module::AddFrame(std::unique_ptr<Frame>& frame) {
frame_list_.emplace(frame->Name(), std::move(frame));
}
void Module::AddFunction(std::unique_ptr<Function>& func) {
function_list_.emplace(func->Name(), std::move(func));
}
void Module::AddGroup(std::unique_ptr<Group>& group) {
group_list_.emplace(group->Name(), std::move(group));
}
void Module::AddInstance(std::unique_ptr<Instance>& instance) {
instance_list_.emplace(instance->Name(), std::move(instance));
}
void Module::AddMeasurement(std::unique_ptr<Measurement>& measurement) {
measurement_list_.emplace(measurement->Name(), std::move(measurement));
}
void Module::AddRecordLayout(std::unique_ptr<RecordLayout>& record_layout) {
record_layout_list_.emplace(record_layout->Name(), std::move(record_layout));
}
void Module::AddTransformer(std::unique_ptr<Transformer>& transformer) {
transformer_list_.emplace(transformer->Name(), std::move(transformer));
}
void Module::AddTypedefAxis(std::unique_ptr<AxisPts>& axis) {
typedef_axis_list_.emplace(axis->Name(), std::move(axis));
}
void Module::AddTypedefBlob(std::unique_ptr<Blob>& blob) {
typedef_blob_list_.emplace(blob->Name(), std::move(blob));
}
void Module::AddTypedefCharacteristic(std::unique_ptr<Characteristic>&
characteristic) {
typedef_characteristic_list_.emplace(characteristic->Name(),
std::move(characteristic));
}
void Module::AddTypedefMeasurement(std::unique_ptr<Measurement>& measurement){
typedef_measurement_list_.emplace(measurement->Name(),
std::move(measurement));
}
void Module::AddTypedefStructure(std::unique_ptr<Structure>& structure){
typedef_structure_list_.emplace(structure->Name(), std::move(structure));
}
void Module::AddUnit(std::unique_ptr<Unit>& unit){
unit_list_.emplace(unit->Name(), std::move(unit));
}
void Module::AddUserRight(std::unique_ptr<A2lUserRight>& user_right){
user_right_list_.emplace(user_right->UserLevelId, std::move(user_right));
}
AxisPts* Module::GetAxisPts(const std::string& name) {
auto itr = axis_pts_list_.find(name);
return itr == axis_pts_list_.end() ? nullptr : itr->second.get();
}
Blob* Module::GetBlob(const std::string& name) {
auto itr = blob_list_.find(name);
return itr == blob_list_.end() ? nullptr : itr->second.get();
}
Characteristic* Module::GetCharacteristic(const std::string& name) {
auto itr = characteristic_list_.find(name);
return itr == characteristic_list_.end() ? nullptr : itr->second.get();
}
CompuTab* Module::GetCompuTab(const std::string& name) {
auto itr = compu_tab_list_.find(name);
return itr == compu_tab_list_.end() ? nullptr : itr->second.get();
}
CompuVtab* Module::GetCompuVtab(const std::string& name) {
auto itr = compu_vtab_list_.find(name);
return itr == compu_vtab_list_.end() ? nullptr : itr->second.get();
}
CompuVtabRange* Module::GetCompuVtabRange(const std::string& name) {
auto itr = compu_vtab_range_list_.find(name);
return itr == compu_vtab_range_list_.end() ? nullptr : itr->second.get();
}
Measurement* Module::GetMeasurement(const std::string& name) {
auto itr = measurement_list_.find(name);
return itr == measurement_list_.end() ? nullptr : itr->second.get();
}
AxisPts* Module::GetTypedefAxis(const std::string& name) {
auto itr = typedef_axis_list_.find(name);
return itr == typedef_axis_list_.end() ? nullptr : itr->second.get();
}
Blob* Module::GetTypedefBlob(const std::string& name) {
auto itr = typedef_blob_list_.find(name);
return itr == typedef_blob_list_.end() ? nullptr : itr->second.get();
}
Characteristic* Module::GetTypedefCharacteristic(const std::string& name) {
auto itr = typedef_characteristic_list_.find(name);
return itr == typedef_characteristic_list_.end() ? nullptr : itr->second.get();
}
Measurement* Module::GetTypedefMeasurement(const std::string& name) {
auto itr = typedef_measurement_list_.find(name);
return itr == typedef_measurement_list_.end() ? nullptr : itr->second.get();
}
Structure* Module::GetTypedefStructure(const std::string& name) {
auto itr = typedef_structure_list_.find(name);
return itr == typedef_structure_list_.end() ? nullptr : itr->second.get();
}
} // namespace a2l

10
TestLibDlg/IncSourceTestDlg/src/overwrite.cpp

@ -0,0 +1,10 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/overwrite.h"
namespace a2l {
}

14
TestLibDlg/IncSourceTestDlg/src/recordlayout.cpp

@ -0,0 +1,14 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/recordlayout.h"
namespace a2l {
void RecordLayout::AddReserved(const A2lDistOp& reserved) {
reserved_list_.emplace_back(reserved);
}
} // end namespace a2l

10
TestLibDlg/IncSourceTestDlg/src/structure.cpp

@ -0,0 +1,10 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/structure.h"
namespace a2l {
}

4
TestLibDlg/IncSourceTestDlg/src/transformer.cpp

@ -0,0 +1,4 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/

10
TestLibDlg/IncSourceTestDlg/src/unit.cpp

@ -0,0 +1,10 @@
/*
* Copyright 2023 Ingemar Hedvall
* SPDX-License-Identifier: MIT
*/
#include "a2l/unit.h"
namespace a2l {
} // end namespace a2l

8
TestLibDlg/IncSourceTestDlg/targetver.h

@ -0,0 +1,8 @@
#pragma once
// SDKDDKVer.h를 포함하면 최고 수준의 가용성을 가진 Windows 플랫폼이 정의됩니다.
// 이전 Windows 플랫폼에 대해 애플리케이션을 빌드하려는 경우에는 SDKDDKVer.h를 포함하기 전에
// WinSDKVer.h를 포함하고 _WIN32_WINNT 매크로를 지원하려는 플랫폼으로 설정하십시오.
#include <SDKDDKVer.h>
Loading…
Cancel
Save