Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
U
uniset2
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
UniSet project repositories
uniset2
Commits
70356296
Commit
70356296
authored
Jun 13, 2013
by
Pavel Vainerman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Исправления по результатам проверки утилитой cppcheck
parent
c5734c82
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
68 additions
and
76 deletions
+68
-76
libuniset.spec
conf/libuniset.spec
+4
-1
UNetExchange.cc
extensions/UNetUDP/UNetExchange.cc
+2
-2
UNetExchange.h
extensions/UNetUDP/UNetExchange.h
+3
-2
UNetReceiver.cc
extensions/UNetUDP/UNetReceiver.cc
+1
-1
UNetReceiver.h
extensions/UNetUDP/UNetReceiver.h
+1
-1
unet-udp-tester.cc
extensions/UNetUDP/unet-udp-tester.cc
+1
-1
MTR.h
extensions/include/MTR.h
+4
-4
UExceptions_wrap.cxx
python/lib/pyUniSet/UExceptions_wrap.cxx
+42
-54
pyUExceptions.py
python/lib/pyUniSet/pyUExceptions.py
+1
-1
ModbusTypes.cc
src/Communications/Modbus/ModbusTypes.cc
+5
-5
Configuration.cc
src/Various/Configuration.cc
+4
-4
No files found.
conf/libuniset.spec
View file @
70356296
...
...
@@ -7,7 +7,7 @@
Name: libuniset
Version: 1.6
Release: alt1
0
Release: alt1
1
Summary: UniSet - library for building distributed industrial control systems
...
...
@@ -319,6 +319,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
%exclude %_pkgconfigdir/libUniSet.pc
%changelog
* Thu Jun 13 2013 Pavel Vainerman <pv@altlinux.ru> 1.6-alt11
- fixed after cppcheck checking
* Wed Jun 05 2013 Pavel Vainerman <pv@altlinux.ru> 1.6-alt10
- add for ModbusMaster (RTU|TCP) --xxx--aftersend-pause
...
...
extensions/UNetUDP/UNetExchange.cc
View file @
70356296
...
...
@@ -351,7 +351,7 @@ UNetExchange::~UNetExchange()
delete
shm
;
}
// -----------------------------------------------------------------------------
bool
UNetExchange
::
checkExistUNetHost
(
const
std
::
string
addr
,
ost
::
tpport_t
port
)
bool
UNetExchange
::
checkExistUNetHost
(
const
std
::
string
&
addr
,
ost
::
tpport_t
port
)
{
ost
::
IPV4Address
a1
(
addr
.
c_str
());
for
(
ReceiverList
::
iterator
it
=
recvlist
.
begin
();
it
!=
recvlist
.
end
();
++
it
)
...
...
@@ -424,7 +424,7 @@ void UNetExchange::step()
}
// -----------------------------------------------------------------------------
void
UNetExchange
::
ReceiverInfo
::
step
(
SMInterface
*
shm
,
const
std
::
string
myname
)
void
UNetExchange
::
ReceiverInfo
::
step
(
SMInterface
*
shm
,
const
std
::
string
&
myname
)
{
try
{
...
...
extensions/UNetUDP/UNetExchange.h
View file @
70356296
...
...
@@ -89,7 +89,7 @@ class UNetExchange:
/*! глобальная функция для вывода help-а */
static
void
help_print
(
int
argc
,
const
char
*
argv
[]
);
bool
checkExistUNetHost
(
const
std
::
string
host
,
ost
::
tpport_t
port
);
bool
checkExistUNetHost
(
const
std
::
string
&
host
,
ost
::
tpport_t
port
);
protected
:
...
...
@@ -142,6 +142,7 @@ class UNetExchange:
{
ReceiverInfo
()
:
r1
(
0
),
r2
(
0
),
sidRespond
(
UniSetTypes
::
DefaultObjectId
),
respondInvert
(
false
),
sidLostPackets
(
UniSetTypes
::
DefaultObjectId
)
{}
...
...
@@ -155,7 +156,7 @@ class UNetExchange:
UNetReceiver
*
r1
;
/*!< приём по первому каналу */
UNetReceiver
*
r2
;
/*!< приём по второму каналу */
void
step
(
SMInterface
*
shm
,
const
std
::
string
myname
);
void
step
(
SMInterface
*
shm
,
const
std
::
string
&
myname
);
inline
void
setRespondID
(
UniSetTypes
::
ObjectId
id
,
bool
invert
=
false
)
{
...
...
extensions/UNetUDP/UNetReceiver.cc
View file @
70356296
...
...
@@ -19,7 +19,7 @@ bool UNetReceiver::PacketCompare::operator()(const UniSetUDP::UDPMessage& lhs,
}
*/
// ------------------------------------------------------------------------------------------
UNetReceiver
::
UNetReceiver
(
const
std
::
string
s_host
,
const
ost
::
tpport_t
port
,
SMInterface
*
smi
)
:
UNetReceiver
::
UNetReceiver
(
const
std
::
string
&
s_host
,
const
ost
::
tpport_t
port
,
SMInterface
*
smi
)
:
shm
(
smi
),
recvpause
(
10
),
updatepause
(
100
),
...
...
extensions/UNetUDP/UNetReceiver.h
View file @
70356296
...
...
@@ -50,7 +50,7 @@
class
UNetReceiver
{
public
:
UNetReceiver
(
const
std
::
string
host
,
const
ost
::
tpport_t
port
,
SMInterface
*
smi
);
UNetReceiver
(
const
std
::
string
&
host
,
const
ost
::
tpport_t
port
,
SMInterface
*
smi
);
~
UNetReceiver
();
void
start
();
...
...
extensions/UNetUDP/unet-udp-tester.cc
View file @
70356296
...
...
@@ -33,7 +33,7 @@ enum Command
cmdReceive
};
// --------------------------------------------------------------------------
static
bool
split_addr
(
const
string
addr
,
string
&
host
,
ost
::
tpport_t
&
port
)
static
bool
split_addr
(
const
string
&
addr
,
string
&
host
,
ost
::
tpport_t
&
port
)
{
string
::
size_type
pos
=
addr
.
rfind
(
':'
);
if
(
pos
!=
string
::
npos
)
...
...
extensions/include/MTR.h
View file @
70356296
...
...
@@ -39,7 +39,7 @@ namespace MTR
};
// -------------------------------------------------------------------------
std
::
string
type2str
(
MTRType
t
);
/*!< преоразование строки в тип */
MTRType
str2type
(
const
std
::
string
s
);
/*!< преобразование названия в строку */
MTRType
str2type
(
const
std
::
string
&
s
);
/*!< преобразование названия в строку */
int
wsize
(
MTRType
t
);
/*!< длина данных в словах */
// -------------------------------------------------------------------------
// Информация
...
...
@@ -100,7 +100,7 @@ namespace MTR
std
::
ostream
&
operator
<<
(
std
::
ostream
&
os
,
MTRError
&
e
);
// Настройка из конф. файла
MTRError
update_configuration
(
ModbusRTUMaster
*
mb
,
ModbusRTU
::
ModbusAddr
addr
,
const
std
::
string
mtrconfile
,
int
verbose
=
0
);
const
std
::
string
&
mtrconfile
,
int
verbose
=
0
);
// ---------------------------
// вспомогательные функции и типы данных
typedef
std
::
list
<
ModbusRTU
::
ModbusData
>
DataList
;
...
...
@@ -109,8 +109,8 @@ namespace MTR
static
const
ModbusRTU
::
ModbusData
skip
[]
=
{
48
,
49
,
59
};
// registers which should not write
bool
send_param
(
ModbusRTUMaster
*
mb
,
DataMap
&
dmap
,
ModbusRTU
::
ModbusAddr
addr
,
int
verb
);
bool
read_param
(
const
std
::
string
str
,
std
::
string
&
str1
,
std
::
string
&
str2
);
DataMap
read_confile
(
const
std
::
string
f
);
bool
read_param
(
const
std
::
string
&
str
,
std
::
string
&
str1
,
std
::
string
&
str2
);
DataMap
read_confile
(
const
std
::
string
&
f
);
void
update_communication_params
(
ModbusRTU
::
ModbusAddr
reg
,
ModbusRTU
::
ModbusData
data
,
ModbusRTUMaster
*
mb
,
ModbusRTU
::
ModbusAddr
&
addr
,
int
verb
);
// -------------------------------------------------------------------------
...
...
python/lib/pyUniSet/UExceptions_wrap.cxx
View file @
70356296
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
* Version 2.0.
8
* Version 2.0.
9
*
* This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
...
...
@@ -927,6 +927,10 @@ static long PyNumber_AsSsize_t (PyObject *x, void *SWIGUNUSEDPARM(exc))
}
#endif
#if PY_VERSION_HEX < 0x02050000
#define PyInt_FromSize_t(x) PyInt_FromLong((long)x)
#endif
#if PY_VERSION_HEX < 0x02040000
#define Py_VISIT(op) \
do { \
...
...
@@ -1198,7 +1202,7 @@ SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self),
/* Runtime API */
#define SWIG_GetModule(clientdata) SWIG_Python_GetModule()
#define SWIG_GetModule(clientdata) SWIG_Python_GetModule(
clientdata
)
#define SWIG_SetModule(clientdata, pointer) SWIG_Python_SetModule(pointer)
#define SWIG_NewClientData(obj) SwigPyClientData_New(obj)
...
...
@@ -2637,7 +2641,7 @@ void *SWIG_ReturnGlobalTypeList(void *);
#endif
SWIGRUNTIME
swig_module_info
*
SWIG_Python_GetModule
(
void
)
{
SWIG_Python_GetModule
(
void
*
SWIGUNUSEDPARM
(
clientdata
)
)
{
static
void
*
type_pointer
=
(
void
*
)
0
;
/* first check if module already created */
if
(
!
type_pointer
)
{
...
...
@@ -2763,7 +2767,7 @@ SWIG_Python_TypeQuery(const char *type)
descriptor
=
(
swig_type_info
*
)
PyCObject_AsVoidPtr
(
obj
);
#endif
}
else
{
swig_module_info
*
swig_module
=
SWIG_
Python_GetModule
(
);
swig_module_info
*
swig_module
=
SWIG_
GetModule
(
0
);
descriptor
=
SWIG_TypeQueryModule
(
swig_module
,
swig_module
,
type
);
if
(
descriptor
)
{
#ifdef SWIGPY_USE_CAPSULE
...
...
@@ -2987,7 +2991,7 @@ static swig_module_info swig_module = {swig_types, 5, 0, 0, 0, 0};
#endif
#define SWIG_name "_pyUExceptions"
#define SWIGVERSION 0x02000
8
#define SWIGVERSION 0x02000
9
#define SWIG_VERSION SWIGVERSION
...
...
@@ -3200,27 +3204,22 @@ fail:
SWIGINTERN
PyObject
*
_wrap_new_UException__SWIG_1
(
PyObject
*
SWIGUNUSEDPARM
(
self
),
PyObject
*
args
)
{
PyObject
*
resultobj
=
0
;
std
::
string
arg1
;
void
*
argp1
;
std
::
string
*
arg1
=
0
;
void
*
argp1
=
0
;
int
res1
=
0
;
PyObject
*
obj0
=
0
;
UException
*
result
=
0
;
if
(
!
PyArg_ParseTuple
(
args
,(
char
*
)
"O:new_UException"
,
&
obj0
))
SWIG_fail
;
{
res1
=
SWIG_ConvertPtr
(
obj0
,
&
argp1
,
SWIGTYPE_p_std__string
,
0
|
0
);
if
(
!
SWIG_IsOK
(
res1
))
{
SWIG_exception_fail
(
SWIG_ArgError
(
res1
),
"in method '"
"new_UException"
"', argument "
"1"" of type '"
"std::string const""'"
);
}
if
(
!
argp1
)
{
SWIG_exception_fail
(
SWIG_ValueError
,
"invalid null reference "
"in method '"
"new_UException"
"', argument "
"1"" of type '"
"std::string const""'"
);
}
else
{
std
::
string
*
temp
=
reinterpret_cast
<
std
::
string
*
>
(
argp1
);
arg1
=
*
temp
;
if
(
SWIG_IsNewObj
(
res1
))
delete
temp
;
}
res1
=
SWIG_ConvertPtr
(
obj0
,
&
argp1
,
SWIGTYPE_p_std__string
,
0
|
0
);
if
(
!
SWIG_IsOK
(
res1
))
{
SWIG_exception_fail
(
SWIG_ArgError
(
res1
),
"in method '"
"new_UException"
"', argument "
"1"" of type '"
"std::string const &""'"
);
}
if
(
!
argp1
)
{
SWIG_exception_fail
(
SWIG_ValueError
,
"invalid null reference "
"in method '"
"new_UException"
"', argument "
"1"" of type '"
"std::string const &""'"
);
}
result
=
(
UException
*
)
new
UException
(
arg1
);
arg1
=
reinterpret_cast
<
std
::
string
*
>
(
argp1
);
result
=
(
UException
*
)
new
UException
((
std
::
string
const
&
)
*
arg1
);
resultobj
=
SWIG_NewPointerObj
(
SWIG_as_voidptr
(
result
),
SWIGTYPE_p_UException
,
SWIG_POINTER_NEW
|
0
);
return
resultobj
;
fail
:
...
...
@@ -3287,7 +3286,7 @@ fail:
SWIG_SetErrorMsg
(
PyExc_NotImplementedError
,
"Wrong number or type of arguments for overloaded function 'new_UException'.
\n
"
" Possible C/C++ prototypes are:
\n
"
" UException::UException()
\n
"
" UException::UException(std::string const)
\n
"
" UException::UException(std::string const
&
)
\n
"
" UException::UException(char const *)
\n
"
);
return
0
;
}
...
...
@@ -3418,27 +3417,22 @@ fail:
SWIGINTERN
PyObject
*
_wrap_new_UTimeOut__SWIG_1
(
PyObject
*
SWIGUNUSEDPARM
(
self
),
PyObject
*
args
)
{
PyObject
*
resultobj
=
0
;
std
::
string
arg1
;
void
*
argp1
;
std
::
string
*
arg1
=
0
;
void
*
argp1
=
0
;
int
res1
=
0
;
PyObject
*
obj0
=
0
;
UTimeOut
*
result
=
0
;
if
(
!
PyArg_ParseTuple
(
args
,(
char
*
)
"O:new_UTimeOut"
,
&
obj0
))
SWIG_fail
;
{
res1
=
SWIG_ConvertPtr
(
obj0
,
&
argp1
,
SWIGTYPE_p_std__string
,
0
|
0
);
if
(
!
SWIG_IsOK
(
res1
))
{
SWIG_exception_fail
(
SWIG_ArgError
(
res1
),
"in method '"
"new_UTimeOut"
"', argument "
"1"" of type '"
"std::string const""'"
);
}
if
(
!
argp1
)
{
SWIG_exception_fail
(
SWIG_ValueError
,
"invalid null reference "
"in method '"
"new_UTimeOut"
"', argument "
"1"" of type '"
"std::string const""'"
);
}
else
{
std
::
string
*
temp
=
reinterpret_cast
<
std
::
string
*
>
(
argp1
);
arg1
=
*
temp
;
if
(
SWIG_IsNewObj
(
res1
))
delete
temp
;
}
res1
=
SWIG_ConvertPtr
(
obj0
,
&
argp1
,
SWIGTYPE_p_std__string
,
0
|
0
);
if
(
!
SWIG_IsOK
(
res1
))
{
SWIG_exception_fail
(
SWIG_ArgError
(
res1
),
"in method '"
"new_UTimeOut"
"', argument "
"1"" of type '"
"std::string const &""'"
);
}
result
=
(
UTimeOut
*
)
new
UTimeOut
(
arg1
);
if
(
!
argp1
)
{
SWIG_exception_fail
(
SWIG_ValueError
,
"invalid null reference "
"in method '"
"new_UTimeOut"
"', argument "
"1"" of type '"
"std::string const &""'"
);
}
arg1
=
reinterpret_cast
<
std
::
string
*
>
(
argp1
);
result
=
(
UTimeOut
*
)
new
UTimeOut
((
std
::
string
const
&
)
*
arg1
);
resultobj
=
SWIG_NewPointerObj
(
SWIG_as_voidptr
(
result
),
SWIGTYPE_p_UTimeOut
,
SWIG_POINTER_NEW
|
0
);
return
resultobj
;
fail
:
...
...
@@ -3472,7 +3466,7 @@ fail:
SWIG_SetErrorMsg
(
PyExc_NotImplementedError
,
"Wrong number or type of arguments for overloaded function 'new_UTimeOut'.
\n
"
" Possible C/C++ prototypes are:
\n
"
" UTimeOut::UTimeOut()
\n
"
" UTimeOut::UTimeOut(std::string const)
\n
"
);
" UTimeOut::UTimeOut(std::string const
&
)
\n
"
);
return
0
;
}
...
...
@@ -3520,27 +3514,22 @@ fail:
SWIGINTERN
PyObject
*
_wrap_new_USysError__SWIG_1
(
PyObject
*
SWIGUNUSEDPARM
(
self
),
PyObject
*
args
)
{
PyObject
*
resultobj
=
0
;
std
::
string
arg1
;
void
*
argp1
;
std
::
string
*
arg1
=
0
;
void
*
argp1
=
0
;
int
res1
=
0
;
PyObject
*
obj0
=
0
;
USysError
*
result
=
0
;
if
(
!
PyArg_ParseTuple
(
args
,(
char
*
)
"O:new_USysError"
,
&
obj0
))
SWIG_fail
;
{
res1
=
SWIG_ConvertPtr
(
obj0
,
&
argp1
,
SWIGTYPE_p_std__string
,
0
|
0
);
if
(
!
SWIG_IsOK
(
res1
))
{
SWIG_exception_fail
(
SWIG_ArgError
(
res1
),
"in method '"
"new_USysError"
"', argument "
"1"" of type '"
"std::string const""'"
);
}
if
(
!
argp1
)
{
SWIG_exception_fail
(
SWIG_ValueError
,
"invalid null reference "
"in method '"
"new_USysError"
"', argument "
"1"" of type '"
"std::string const""'"
);
}
else
{
std
::
string
*
temp
=
reinterpret_cast
<
std
::
string
*
>
(
argp1
);
arg1
=
*
temp
;
if
(
SWIG_IsNewObj
(
res1
))
delete
temp
;
}
res1
=
SWIG_ConvertPtr
(
obj0
,
&
argp1
,
SWIGTYPE_p_std__string
,
0
|
0
);
if
(
!
SWIG_IsOK
(
res1
))
{
SWIG_exception_fail
(
SWIG_ArgError
(
res1
),
"in method '"
"new_USysError"
"', argument "
"1"" of type '"
"std::string const &""'"
);
}
if
(
!
argp1
)
{
SWIG_exception_fail
(
SWIG_ValueError
,
"invalid null reference "
"in method '"
"new_USysError"
"', argument "
"1"" of type '"
"std::string const &""'"
);
}
result
=
(
USysError
*
)
new
USysError
(
arg1
);
arg1
=
reinterpret_cast
<
std
::
string
*
>
(
argp1
);
result
=
(
USysError
*
)
new
USysError
((
std
::
string
const
&
)
*
arg1
);
resultobj
=
SWIG_NewPointerObj
(
SWIG_as_voidptr
(
result
),
SWIGTYPE_p_USysError
,
SWIG_POINTER_NEW
|
0
);
return
resultobj
;
fail
:
...
...
@@ -3574,7 +3563,7 @@ fail:
SWIG_SetErrorMsg
(
PyExc_NotImplementedError
,
"Wrong number or type of arguments for overloaded function 'new_USysError'.
\n
"
" Possible C/C++ prototypes are:
\n
"
" USysError::USysError()
\n
"
" USysError::USysError(std::string const)
\n
"
);
" USysError::USysError(std::string const
&
)
\n
"
);
return
0
;
}
...
...
@@ -3728,7 +3717,6 @@ SWIG_InitializeModule(void *clientdata) {
size_t
i
;
swig_module_info
*
module_head
,
*
iter
;
int
found
,
init
;
(
void
*
)
clientdata
;
/* check to see if the circular list has been setup, if not, set it up */
if
(
swig_module
.
next
==
0
)
{
...
...
python/lib/pyUniSet/pyUExceptions.py
View file @
70356296
# This file was automatically generated by SWIG (http://www.swig.org).
# Version 2.0.
8
# Version 2.0.
9
#
# Do not make changes to this file unless you know what you are doing--modify
# the SWIG interface file instead.
...
...
src/Communications/Modbus/ModbusTypes.cc
View file @
70356296
...
...
@@ -972,7 +972,7 @@ ModbusMessage ReadOutputRetMessage::transport_msg()
// копируем
memcpy
(
&
(
mm
.
data
[
ind
]),
dtmp
,
bcnt
);
delete
dtmp
;
delete
[]
dtmp
;
ind
+=
bcnt
;
...
...
@@ -1183,7 +1183,7 @@ ModbusMessage ReadInputRetMessage::transport_msg()
// копируем
memcpy
(
&
(
mm
.
data
[
ind
]),
dtmp
,
bcnt
);
delete
dtmp
;
delete
[]
dtmp
;
ind
+=
bcnt
;
...
...
@@ -1547,7 +1547,7 @@ ModbusMessage WriteOutputMessage::transport_msg()
// копируем данные
memcpy
(
&
(
mm
.
data
[
ind
]),
dtmp
,
bcnt
);
delete
dtmp
;
delete
[]
dtmp
;
ind
+=
bcnt
;
...
...
@@ -2250,7 +2250,7 @@ ModbusMessage DiagnosticMessage::transport_msg()
// копируем
memcpy
(
&
(
mm
.
data
[
ind
]),
dtmp
,
sizeof
(
ModbusData
)
*
count
);
delete
dtmp
;
delete
[]
dtmp
;
ind
+=
sizeof
(
ModbusData
)
*
count
;
...
...
@@ -2745,7 +2745,7 @@ ModbusMessage JournalCommandRetMessage::transport_msg()
// копируем
memcpy
(
&
(
mm
.
data
[
ind
]),
dtmp
,
bcnt
);
delete
dtmp
;
delete
[]
dtmp
;
ind
+=
bcnt
;
...
...
src/Various/Configuration.cc
View file @
70356296
...
...
@@ -47,8 +47,8 @@ using namespace std;
// -------------------------------------------------------------------------
static
const
string
UniSetDefaultPort
=
"2809"
;
// -------------------------------------------------------------------------
static
ostream
&
print_help
(
ostream
&
os
,
int
width
,
const
string
cmd
,
const
string
help
,
const
string
tab
=
""
)
static
ostream
&
print_help
(
ostream
&
os
,
int
width
,
const
string
&
cmd
,
const
string
&
help
,
const
string
&
tab
=
""
)
{
// чтобы не менчять параметры основного потока
// создаём свой stream...
...
...
@@ -256,7 +256,7 @@ void Configuration::initConfiguration( int argc, const char* const* argv )
catch
(
Exception
&
ex
)
{
unideb
[
Debug
::
CRIT
]
<<
"(Configuration:init): INIT FAILED! from "
<<
fileConfName
<<
endl
;
throw
ex
;
throw
;
}
}
}
...
...
@@ -1096,7 +1096,7 @@ UniversalIO::IOTypes Configuration::getIOType( const std::string name )
return
UniversalIO
::
UnknownIOType
;
}
// -------------------------------------------------------------------------
void
uniset_init
(
int
argc
,
const
char
*
const
*
argv
,
const
std
::
string
xmlfile
)
void
uniset_init
(
int
argc
,
const
char
*
const
*
argv
,
const
std
::
string
&
xmlfile
)
{
string
confile
=
UniSetTypes
::
getArgParam
(
"--confile"
,
argc
,
argv
,
xmlfile
);
UniSetTypes
::
conf
=
new
Configuration
(
argc
,
argv
,
confile
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment