Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitfc9663a

Browse files
committed
Added separated common attributes creator.
1 parent74b4b2d commitfc9663a

File tree

6 files changed

+169
-90
lines changed

6 files changed

+169
-90
lines changed

‎DbcScanner.vcxproj‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@
158158
<ClIncludeInclude="src\codegen\c-main-generator.h" />
159159
<ClIncludeInclude="src\codegen\c-sigprinter.h" />
160160
<ClIncludeInclude="src\codegen\filewriter.h" />
161+
<ClIncludeInclude="src\codegen\fs-creator.h" />
161162
<ClIncludeInclude="src\parser\dbclineparser.h" />
162163
<ClIncludeInclude="src\parser\dbcscanner.h" />
163164
<ClIncludeInclude="src\types\attributes.h" />
@@ -170,6 +171,7 @@
170171
<ClCompileInclude="src\codegen\c-main-generator.cpp" />
171172
<ClCompileInclude="src\codegen\c-sigprinter.cpp" />
172173
<ClCompileInclude="src\codegen\filewriter.cpp" />
174+
<ClCompileInclude="src\codegen\fs-creator.cpp" />
173175
<ClCompileInclude="src\parser\dbclineparser.cpp" />
174176
<ClCompileInclude="src\parser\dbcscanner.cpp" />
175177
</ItemGroup>

‎DbcScanner.vcxproj.filters‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@
4545
<ClIncludeInclude="src\codegen\filewriter.h">
4646
<Filter>Header Files</Filter>
4747
</ClInclude>
48+
<ClIncludeInclude="src\codegen\fs-creator.h">
49+
<Filter>Header Files</Filter>
50+
</ClInclude>
4851
</ItemGroup>
4952
<ItemGroup>
5053
<ClCompileInclude="src\parser\dbclineparser.cpp">
@@ -62,5 +65,8 @@
6265
<ClCompileInclude="src\codegen\filewriter.cpp">
6366
<Filter>Source Files</Filter>
6467
</ClCompile>
68+
<ClCompileInclude="src\codegen\fs-creator.cpp">
69+
<Filter>Source Files</Filter>
70+
</ClCompile>
6571
</ItemGroup>
6672
</Project>

‎src/codegen/c-main-generator.cpp‎

Lines changed: 9 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -37,25 +37,13 @@ char* PrintF(const char* format, ...)
3737
return wbuff;
3838
}
3939

40-
std::stringstr_toupper(std::string s)
41-
{
42-
std::transform(s.begin(), s.end(), s.begin(),
43-
[](unsignedchar c)
44-
{
45-
returnstd::toupper(c);
46-
});
47-
return s;
48-
}
49-
5040
CiMainGenerator::CiMainGenerator()
5141
{
5242
sigprt =new CSigPrinter;
5343
fwriter =new FileWriter;
5444
}
5545

56-
voidCiMainGenerator::Generate(std::vector<MessageDescriptor_t*>& msgs,
57-
std::string drvname,
58-
std::string dirpath)
46+
voidCiMainGenerator::Generate(std::vector<MessageDescriptor_t*>& msgs,const FsDescriptor_t& fsd)
5947
{
6048
// Load income messages to sig printer
6149
sigprt->LoadMessages(msgs);
@@ -66,21 +54,6 @@ void CiMainGenerator::Generate(std::vector<MessageDescriptor_t*>& msgs,
6654
return a->msg.MsgID < b->msg.MsgID;
6755
});
6856

69-
auto dirok =SetFinalPath(dirpath);
70-
71-
if (!dirok)
72-
{
73-
// TODO: handle error if directory cannot be used
74-
}
75-
76-
SetCommonValues(drvname);
77-
78-
// work_dir_path has the base dir path to gen files
79-
// 1 step is to define final directory for source code bunch
80-
mhead.dir = work_dir_path;
81-
mhead.fname = drvname +".h";
82-
mhead.fpath = mhead.dir +"/" + mhead.fname;
83-
8457
// 2 step is to print main head file
8558
fwriter->AppendLine("#pragma once",2);
8659
fwriter->AppendLine("#ifdef __cplusplus\nextern\"C\" {\n#endif",2);
@@ -180,28 +153,28 @@ void CiMainGenerator::Generate(std::vector<MessageDescriptor_t*>& msgs,
180153
{
181154
// write message typedef s and additional expressions
182155
MessageDescriptor_t& m = sigprt->sigs_expr[num]->msg;
183-
156+
184157
fwriter->AppendLine(
185158
PrintF("uint32_t Unpack_%s_%s(%s_t* _m, const uint8_t* _d, uint8_t dlc_);",
186-
m.Name.c_str(), drvname.c_str(), m.Name.c_str()));
159+
m.Name.c_str(),fsd.drvname.c_str(), m.Name.c_str()));
187160

188161
fwriter->AppendLine(PrintF("#ifdef %s", usestruct_str.c_str()));
189-
162+
190163
fwriter->AppendLine(
191164
PrintF("uint32_t Pack_%s_%s(const %s_t* _m, __CoderDbcCanFrame_t__* cframe);",
192-
m.Name.c_str(), drvname.c_str(), m.Name.c_str()));
193-
165+
m.Name.c_str(),fsd.drvname.c_str(), m.Name.c_str()));
166+
194167
fwriter->AppendLine("#else");
195-
168+
196169
fwriter->AppendLine(
197170
PrintF("uint32_t Pack_%s_%s(const %s_t* _m, uint8_t* _d, uint8_t* _len, uint8_t* _ide);",
198-
m.Name.c_str(), drvname.c_str(), m.Name.c_str()));
171+
m.Name.c_str(),fsd.drvname.c_str(), m.Name.c_str()));
199172

200173
fwriter->AppendLine(PrintF("#endif // %s", usestruct_str.c_str()),2);
201174
}
202175

203176
fwriter->AppendLine("#ifdef __cplusplus\n}\n#endif");
204-
fwriter->Flush(mhead.fpath);
177+
fwriter->Flush(fsd.core_h.fpath);
205178

206179
// 3 step is to print main source file
207180

@@ -269,48 +242,3 @@ void CiMainGenerator::WriteSigStructField(const SignalDescriptor_t& sig, bool bi
269242
fwriter->AppendLine("",2);
270243
}
271244

272-
boolCiMainGenerator::SetFinalPath(std::string dirpath)
273-
{
274-
// find free directory
275-
structstat info;
276-
277-
for (int32_t dirnum =0; dirnum <1000; dirnum++)
278-
{
279-
snprintf(wbuff,kWBUFF_len,"%03d", dirnum);
280-
work_dir_path = dirpath +"/" + wbuff;
281-
282-
if (stat(work_dir_path.c_str(), &info) !=0)
283-
{
284-
if (std::filesystem::create_directory(work_dir_path))
285-
returntrue;
286-
else
287-
returnfalse;
288-
}
289-
elseif (info.st_mode & S_IFDIR)
290-
{
291-
// directory exists, try next num
292-
continue;
293-
}
294-
else
295-
{
296-
if (std::filesystem::create_directory(work_dir_path) !=0)
297-
returnfalse;
298-
}
299-
}
300-
301-
returntrue;
302-
}
303-
304-
voidCiMainGenerator::SetCommonValues(const std::string& drvname)
305-
{
306-
DRVNAME =str_toupper(drvname);
307-
308-
snprintf(wbuff,kWBUFF_len,"%s_USE_BITS_SIGNAL", DRVNAME.c_str());
309-
usebits_str = wbuff;
310-
311-
snprintf(wbuff,kWBUFF_len,"%s_USE_DIAG_MONITORS", DRVNAME.c_str());
312-
usediag_str = wbuff;
313-
314-
snprintf(wbuff,kWBUFF_len,"%s_USE_CANSTRUCT", DRVNAME.c_str());
315-
usestruct_str = wbuff;
316-
}

‎src/codegen/c-main-generator.h‎

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,15 @@
55
#include"filewriter.h"
66
#include"../types/message.h"
77
#include"../types/outfile.h"
8+
#include"fs-creator.h"
89

910
classCiMainGenerator {
1011
public:
1112
CiMainGenerator();
1213

13-
voidGenerate(std::vector<MessageDescriptor_t*>& msgs,std::string drvname, std::string dirpath);
14+
voidGenerate(std::vector<MessageDescriptor_t*>& msgs,const FsDescriptor_t& fsd);
1415

1516
private:
16-
boolSetFinalPath(std::string dirpath);
17-
18-
voidSetCommonValues(const std::string& drvname);
1917

2018
voidWriteSigStructField(const SignalDescriptor_t& sig,bool bitfield,size_t pad);
2119

@@ -35,9 +33,4 @@ class CiMainGenerator {
3533
CSigPrinter* sigprt;
3634

3735
FileWriter* fwriter;
38-
39-
OutFileDescriptor_t mhead;
40-
OutFileDescriptor_t mcode;
41-
OutFileDescriptor_t fhead;
42-
OutFileDescriptor_t fcode;
4336
};

‎src/codegen/fs-creator.cpp‎

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
#include"fs-creator.h"
2+
#include<sys/stat.h>
3+
#include<iostream>
4+
#include<fstream>
5+
#include<cstdlib>
6+
#include<filesystem>
7+
8+
staticconstint32_tkTmpLen =1024;
9+
10+
staticchar _tmpb[kTmpLen];
11+
12+
13+
std::stringstr_toupper(std::string s)
14+
{
15+
std::transform(s.begin(), s.end(), s.begin(),
16+
[](unsignedchar c)
17+
{
18+
returnstd::toupper(c);
19+
});
20+
return s;
21+
}
22+
23+
24+
std::stringstr_tolower(std::string s)
25+
{
26+
std::transform(s.begin(), s.end(), s.begin(),
27+
[](unsignedchar c)
28+
{
29+
returnstd::tolower(c);
30+
});
31+
return s;
32+
}
33+
34+
FsCreator::FsCreator()
35+
{
36+
}
37+
38+
boolFsCreator::PrepareDirectory(std::string drvname, std::string basepath,bool rw)
39+
{
40+
bool ret =false;
41+
42+
// find free directory
43+
structstat info;
44+
45+
std::string work_dir_path;
46+
47+
for (int32_t dirnum =0; dirnum <1000; dirnum++)
48+
{
49+
snprintf(_tmpb,kTmpLen,"%03d", dirnum);
50+
work_dir_path = basepath +"/" + _tmpb;
51+
52+
if (stat(work_dir_path.c_str(), &info) !=0)
53+
{
54+
if (std::filesystem::create_directory(work_dir_path))
55+
{
56+
ret =true;
57+
break;
58+
}
59+
}
60+
elseif (info.st_mode & S_IFDIR)
61+
{
62+
// directory exists, try next num
63+
continue;
64+
}
65+
else
66+
{
67+
if (std::filesystem::create_directory(work_dir_path) !=0)
68+
{
69+
ret =false;
70+
break;
71+
}
72+
}
73+
}
74+
75+
if (ret)
76+
{
77+
// directory valid and exists, set all the values
78+
FS.drvname = drvname;
79+
FS.DRVNAME =str_toupper(drvname);
80+
81+
std::string ldrvname =str_tolower(drvname);
82+
83+
FS.core_h.dir = work_dir_path;
84+
FS.core_h.fname = ldrvname +".h";
85+
FS.core_h.fpath = work_dir_path +"/" + FS.core_h.fname;
86+
87+
FS.core_c.dir = work_dir_path;
88+
FS.core_c.fname = ldrvname +".c";
89+
FS.core_c.fpath = work_dir_path +"/" + FS.core_c.fname;
90+
91+
FS.util_h.dir = work_dir_path;
92+
FS.util_h.fname = ldrvname +"_binutil" +".h";
93+
FS.util_h.fpath = work_dir_path +"/" + FS.util_h.fname;
94+
95+
FS.util_c.dir = work_dir_path;
96+
FS.util_c.fname = ldrvname +"_binutil" +".c";
97+
FS.util_c.fpath = work_dir_path +"/" + FS.util_c.fname;
98+
99+
snprintf(_tmpb,kTmpLen,"%s_USE_BITS_SIGNAL", FS.DRVNAME.c_str());
100+
FS.usebits_def = _tmpb;
101+
102+
snprintf(_tmpb,kTmpLen,"%s_USE_DIAG_MONITORS", FS.DRVNAME.c_str());
103+
FS.usemon_def = _tmpb;
104+
105+
snprintf(_tmpb,kTmpLen,"%s_USE_CANSTRUCT", FS.DRVNAME.c_str());
106+
FS.usesruct_def = _tmpb;
107+
}
108+
109+
return ret;
110+
}

‎src/codegen/fs-creator.h‎

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#pragma once
2+
3+
#include<stdint.h>
4+
#include<string>
5+
#include"../types/outfile.h"
6+
7+
typedefstruct
8+
{
9+
// low case driver name
10+
std::string drvname;
11+
// up case driver name
12+
std::string DRVNAME;
13+
14+
OutFileDescriptor_t core_h;
15+
OutFileDescriptor_t core_c;
16+
17+
OutFileDescriptor_t util_h;
18+
OutFileDescriptor_t util_c;
19+
20+
std::string usebits_def;
21+
std::string usesruct_def;
22+
std::string usemon_def;
23+
24+
} FsDescriptor_t;
25+
26+
// This class is used to build all neccessary string -ed
27+
// value that will be required during code generation
28+
// (paths, file names, drvnames, common defines etc)
29+
// if preparation ends with true, the collection of
30+
// values can be used.
31+
classFsCreator {
32+
public:
33+
FsCreator();
34+
35+
boolPrepareDirectory(std::string drvname, std::string basepath,bool rw);
36+
37+
FsDescriptor_t FS;
38+
39+
};
40+

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp