Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
kicad-source-mirror
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
kicad-source-mirror
Commits
ba92f94f
Commit
ba92f94f
authored
Apr 24, 2008
by
dickelbeck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ProcessExecute instead of wxExecute
parent
080746ac
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
256 additions
and
214 deletions
+256
-214
common.cpp
common/common.cpp
+13
-2
eda_doc.cpp
common/eda_doc.cpp
+221
-202
gestfich.cpp
common/gestfich.cpp
+3
-3
netform.cpp
eeschema/netform.cpp
+1
-1
common.h
include/common.h
+16
-4
dialog_freeroute_exchange.cpp
pcbnew/dialog_freeroute_exchange.cpp
+1
-1
router.cpp
pcbnew/router.cpp
+1
-1
No files found.
common/common.cpp
View file @
ba92f94f
...
...
@@ -12,7 +12,7 @@
#include "common.h"
#include "macros.h"
#include "build_version.h"
#include <wx/process.h>
/*****************************/
wxString
GetBuildVersion
()
...
...
@@ -30,7 +30,9 @@ Ki_PageDescr::Ki_PageDescr( const wxSize& size, const wxPoint& offset, const wxS
/*********************************************************************************************/
{
// All sizes are in 1/1000 inch
m_Size
=
size
;
m_Offset
=
offset
,
m_Name
=
name
;
m_Size
=
size
;
m_Offset
=
offset
;
m_Name
=
name
;
// Adjust the default value for margins to 400 mils (0,4 inch or 10 mm)
m_LeftMargin
=
m_RightMargin
=
m_TopMargin
=
m_BottomMargin
=
400
;
...
...
@@ -205,6 +207,7 @@ wxString GenDate()
wxT
(
"jan"
),
wxT
(
"feb"
),
wxT
(
"mar"
),
wxT
(
"apr"
),
wxT
(
"may"
),
wxT
(
"jun"
),
wxT
(
"jul"
),
wxT
(
"aug"
),
wxT
(
"sep"
),
wxT
(
"oct"
),
wxT
(
"nov"
),
wxT
(
"dec"
)
};
time_t
buftime
;
struct
tm
*
Date
;
wxString
string_date
;
...
...
@@ -241,6 +244,14 @@ void* MyMalloc( size_t nb_octets )
}
bool
ProcessExecute
(
const
wxString
&
aCommandLine
,
int
aFlags
)
{
wxProcess
*
process
=
wxProcess
::
Open
(
aCommandLine
,
aFlags
);
return
process
!=
NULL
;
}
/************************************/
void
*
MyZMalloc
(
size_t
nb_octets
)
/************************************/
...
...
common/eda_doc.cpp
View file @
ba92f94f
/***************/
/* eda_doc.cpp */
/***************/
/***************/
/* eda_doc.cpp */
/***************/
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
...
...
@@ -24,239 +24,258 @@
/*****************************************/
void
WinEDA_App
::
ReadPdfBrowserInfos
()
/*****************************************/
/* Read from Common config the Pdf browser choice
*/
*/
{
if
(
m_EDA_CommonConfig
)
{
m_PdfBrowserIsDefault
=
m_EDA_CommonConfig
->
Read
(
wxT
(
"PdfBrowserIsDefault"
),
TRUE
);
m_PdfBrowser
=
m_EDA_CommonConfig
->
Read
(
wxT
(
"PdfBrowserName"
),
wxEmptyString
);
}
if
(
m_PdfBrowser
.
IsEmpty
()
)
m_PdfBrowserIsDefault
=
TRUE
;
if
(
m_EDA_CommonConfig
)
{
m_PdfBrowserIsDefault
=
m_EDA_CommonConfig
->
Read
(
wxT
(
"PdfBrowserIsDefault"
),
TRUE
);
m_PdfBrowser
=
m_EDA_CommonConfig
->
Read
(
wxT
(
"PdfBrowserName"
),
wxEmptyString
);
}
if
(
m_PdfBrowser
.
IsEmpty
()
)
m_PdfBrowserIsDefault
=
TRUE
;
}
/*****************************************/
void
WinEDA_App
::
WritePdfBrowserInfos
()
/*****************************************/
/* Write into Common config the Pdf browser choice
*/
*/
{
if
(
!
m_EDA_CommonConfig
)
return
;
if
(
m_PdfBrowser
.
IsEmpty
()
)
m_PdfBrowserIsDefault
=
TRUE
;
m_EDA_CommonConfig
->
Write
(
wxT
(
"PdfBrowserIsDefault"
),
m_PdfBrowserIsDefault
);
m_EDA_CommonConfig
->
Write
(
wxT
(
"PdfBrowserName"
),
m_PdfBrowser
);
if
(
!
m_EDA_CommonConfig
)
return
;
if
(
m_PdfBrowser
.
IsEmpty
()
)
m_PdfBrowserIsDefault
=
TRUE
;
m_EDA_CommonConfig
->
Write
(
wxT
(
"PdfBrowserIsDefault"
),
m_PdfBrowserIsDefault
);
m_EDA_CommonConfig
->
Write
(
wxT
(
"PdfBrowserName"
),
m_PdfBrowser
);
}
// Mime type extensions
static
wxMimeTypesManager
*
mimeDatabase
;
static
wxMimeTypesManager
*
mimeDatabase
;
static
const
wxFileTypeInfo
EDAfallbacks
[]
=
{
wxFileTypeInfo
(
wxT
(
"text/pdf"
),
wxT
(
"xpdf %s"
),
wxT
(
"xpdf -p %s"
),
wxT
(
"pdf document (from Kicad)"
),
wxT
(
"pdf"
),
wxT
(
"PDF"
),
NULL
),
wxFileTypeInfo
(
wxT
(
"text/html"
),
wxT
(
"wxhtml %s"
),
wxT
(
"wxhtml %s"
),
wxT
(
"html document (from Kicad)"
),
wxT
(
"htm"
),
wxT
(
"html"
),
NULL
),
wxFileTypeInfo
(
wxT
(
"application/sch"
),
wxT
(
"eeschema %s"
),
wxT
(
"eeschema -p %s"
),
wxT
(
"sch document (from Kicad)"
),
wxT
(
"sch"
),
wxT
(
"SCH"
),
NULL
),
// must terminate the table with this!
wxFileTypeInfo
()
{
wxFileTypeInfo
(
wxT
(
"text/pdf"
),
wxT
(
"xpdf %s"
),
wxT
(
"xpdf -p %s"
),
wxT
(
"pdf document (from Kicad)"
),
wxT
(
"pdf"
),
wxT
(
"PDF"
),
NULL
),
wxFileTypeInfo
(
wxT
(
"text/html"
),
wxT
(
"wxhtml %s"
),
wxT
(
"wxhtml %s"
),
wxT
(
"html document (from Kicad)"
),
wxT
(
"htm"
),
wxT
(
"html"
),
NULL
),
wxFileTypeInfo
(
wxT
(
"application/sch"
),
wxT
(
"eeschema %s"
),
wxT
(
"eeschema -p %s"
),
wxT
(
"sch document (from Kicad)"
),
wxT
(
"sch"
),
wxT
(
"SCH"
),
NULL
),
// must terminate the table with this!
wxFileTypeInfo
()
};
/********************************************************************/
bool
GetAssociatedDocument
(
wxFrame
*
frame
,
const
wxString
&
LibPath
,
const
wxString
&
DocName
)
bool
GetAssociatedDocument
(
wxFrame
*
frame
,
const
wxString
&
LibPath
,
const
wxString
&
DocName
)
/*********************************************************************/
/* Launch the viewer for the doc file DocName (mime type)
LibPath is the doc file search path:
(kicad/library)
DocName is the short filename with ext. Wildcarts are allowed
Seach file is made in LibPath/doc/DocName
if DocName is starting by http: or ftp: or www. the default internet browser is launched
*/
/* Launch the viewer for the doc file DocName (mime type)
* LibPath is the doc file search path:
* (kicad/library)
* DocName is the short filename with ext. Wildcarts are allowed
* Seach file is made in LibPath/doc/DocName
*
* if DocName is starting by http: or ftp: or www. the default internet browser is launched
*/
{
wxString
docpath
,
fullfilename
;
wxString
Line
;
wxString
command
;
bool
success
=
FALSE
;
// Is an internet url
wxString
url_header
[
3
]
=
{
wxT
(
"http:"
),
wxT
(
"ftp:"
),
wxT
(
"www."
)
};
for
(
int
ii
=
0
;
ii
<
3
;
ii
++
)
{
if
(
DocName
.
First
(
url_header
[
ii
])
==
0
)
//. seems an internet url
{
wxLaunchDefaultBrowser
(
DocName
);
return
TRUE
;
}
}
/* Compute the full file name */
if
(
wxIsAbsolutePath
(
DocName
)
)
fullfilename
=
DocName
;
else
{
docpath
=
LibPath
+
wxT
(
"doc/"
);
fullfilename
=
docpath
+
DocName
;
}
wxString
docpath
,
fullfilename
;
wxString
Line
;
wxString
command
;
bool
success
=
FALSE
;
// Is an internet url
static
const
wxString
url_header
[
3
]
=
{
wxT
(
"http:"
),
wxT
(
"ftp:"
),
wxT
(
"www."
)
};
for
(
int
ii
=
0
;
ii
<
3
;
ii
++
)
{
if
(
DocName
.
First
(
url_header
[
ii
]
)
==
0
)
//. seems an internet url
{
wxLaunchDefaultBrowser
(
DocName
);
return
TRUE
;
}
}
/* Compute the full file name */
if
(
wxIsAbsolutePath
(
DocName
)
)
fullfilename
=
DocName
;
else
{
docpath
=
LibPath
+
wxT
(
"doc/"
);
fullfilename
=
docpath
+
DocName
;
}
#ifdef __WINDOWS__
fullfilename
.
Replace
(
UNIX_STRING_DIR_SEP
,
WIN_STRING_DIR_SEP
);
fullfilename
.
Replace
(
UNIX_STRING_DIR_SEP
,
WIN_STRING_DIR_SEP
);
#else
fullfilename
.
Replace
(
WIN_STRING_DIR_SEP
,
UNIX_STRING_DIR_SEP
);
fullfilename
.
Replace
(
WIN_STRING_DIR_SEP
,
UNIX_STRING_DIR_SEP
);
#endif
wxString
mask
(
wxT
(
"*"
)),
extension
;
wxString
mask
(
wxT
(
"*"
)
),
extension
;
#ifdef __WINDOWS__
mask
+=
wxT
(
".*"
);
extension
=
wxT
(
".*"
);
mask
+=
wxT
(
".*"
);
extension
=
wxT
(
".*"
);
#endif
if
(
wxIsWild
(
fullfilename
)
)
{
fullfilename
=
EDA_FileSelector
(
_
(
"Doc Files"
),
/* Titre de la fenetre */
wxPathOnly
(
fullfilename
),
/* Chemin par defaut */
fullfilename
,
/* nom fichier par defaut */
extension
,
/* extension par defaut */
mask
,
/* Masque d'affichage */
frame
,
/* parent frame */
wxFD_OPEN
,
/* wxSAVE, wxFD_OPEN ..*/
TRUE
,
/* true = ne change pas le repertoire courant */
wxPoint
(
-
1
,
-
1
)
);
if
(
fullfilename
.
IsEmpty
()
)
return
FALSE
;
}
if
(
!
wxFileExists
(
fullfilename
)
)
{
Line
=
_
(
"Doc File "
)
+
fullfilename
+
_
(
" not found"
);
DisplayError
(
frame
,
Line
);
return
FALSE
;
}
/* Try to launch some browser (usefull under linux) */
g_EDA_Appl
->
ReadPdfBrowserInfos
();
if
(
g_EDA_Appl
->
m_PdfBrowserIsDefault
)
{
wxFileType
*
filetype
;
wxFileName
CurrentFileName
(
fullfilename
);
wxString
ext
,
type
;
ext
=
CurrentFileName
.
GetExt
();
filetype
=
wxTheMimeTypesManager
->
GetFileTypeFromExtension
(
ext
);
if
(
!
filetype
)
// 2ieme tentative
{
mimeDatabase
=
new
wxMimeTypesManager
;
mimeDatabase
->
AddFallbacks
(
EDAfallbacks
);
filetype
=
mimeDatabase
->
GetFileTypeFromExtension
(
ext
);
delete
mimeDatabase
;
mimeDatabase
=
NULL
;
}
if
(
filetype
)
{
wxFileType
::
MessageParameters
params
(
fullfilename
,
type
);
success
=
filetype
->
GetOpenCommand
(
&
command
,
params
);
delete
filetype
;
if
(
success
)
wxExecute
(
command
);
}
if
(
!
success
)
{
#ifdef __LINUX__
if
(
ext
==
wxT
(
"pdf"
)
)
{
success
=
TRUE
;
command
.
Empty
();
if
(
wxFileExists
(
wxT
(
"/usr/bin/xpdf"
))
)
command
=
wxT
(
"xpdf "
)
+
fullfilename
;
else
if
(
wxFileExists
(
wxT
(
"/usr/bin/konqueror"
)
))
command
=
wxT
(
"konqueror "
)
+
fullfilename
;
else
if
(
wxFileExists
(
wxT
(
"/usr/bin/gpdf"
)
))
command
=
wxT
(
"gpdf "
)
+
fullfilename
;
if
(
command
.
IsEmpty
()
)
// not started
{
DisplayError
(
frame
,
_
(
" Cannot find the PDF viewer (xpdf, gpdf or konqueror) in /usr/bin/"
)
);
success
=
FALSE
;
}
else
wxExecute
(
command
);
}
else
#endif
{
Line
.
Printf
(
_
(
"Unknown MIME type for Doc File [%s] (%s)"
),
fullfilename
.
GetData
(),
ext
.
GetData
());
DisplayError
(
frame
,
Line
);
}
}
}
else
{
command
=
g_EDA_Appl
->
m_PdfBrowser
;
if
(
wxFileExists
(
command
)
)
{
success
=
TRUE
;
AddDelimiterString
(
fullfilename
);
command
+=
wxT
(
" "
)
+
fullfilename
;
wxExecute
(
command
);
}
else
{
Line
.
Printf
(
_
(
"Cannot find Pdf viewer %s"
),
command
.
GetData
());
DisplayError
(
frame
,
Line
);
}
}
return
success
;
if
(
wxIsWild
(
fullfilename
)
)
{
fullfilename
=
EDA_FileSelector
(
_
(
"Doc Files"
),
/* Titre de la fenetre */
wxPathOnly
(
fullfilename
),
/* Chemin par defaut */
fullfilename
,
/* nom fichier par defaut */
extension
,
/* extension par defaut */
mask
,
/* Masque d'affichage */
frame
,
/* parent frame */
wxFD_OPEN
,
/* wxSAVE, wxFD_OPEN ..*/
TRUE
,
/* true = ne change pas le repertoire courant */
wxPoint
(
-
1
,
-
1
)
);
if
(
fullfilename
.
IsEmpty
()
)
return
FALSE
;
}
if
(
!
wxFileExists
(
fullfilename
)
)
{
Line
=
_
(
"Doc File "
)
+
fullfilename
+
_
(
" not found"
);
DisplayError
(
frame
,
Line
);
return
FALSE
;
}
/* Try to launch some browser (usefull under linux) */
g_EDA_Appl
->
ReadPdfBrowserInfos
();
if
(
g_EDA_Appl
->
m_PdfBrowserIsDefault
)
{
wxFileType
*
filetype
;
wxFileName
CurrentFileName
(
fullfilename
);
wxString
ext
,
type
;
ext
=
CurrentFileName
.
GetExt
();
filetype
=
wxTheMimeTypesManager
->
GetFileTypeFromExtension
(
ext
);
if
(
!
filetype
)
// 2ieme tentative
{
mimeDatabase
=
new
wxMimeTypesManager
;
mimeDatabase
->
AddFallbacks
(
EDAfallbacks
);
filetype
=
mimeDatabase
->
GetFileTypeFromExtension
(
ext
);
delete
mimeDatabase
;
mimeDatabase
=
NULL
;
}
if
(
filetype
)
{
wxFileType
::
MessageParameters
params
(
fullfilename
,
type
);
success
=
filetype
->
GetOpenCommand
(
&
command
,
params
);
delete
filetype
;
if
(
success
)
ProcessExecute
(
command
);
}
if
(
!
success
)
{
#ifdef __LINUX__
if
(
ext
==
wxT
(
"pdf"
)
)
{
success
=
TRUE
;
command
.
Empty
();
if
(
wxFileExists
(
wxT
(
"/usr/bin/kpdf"
)
)
)
command
=
wxT
(
"xpdf "
)
+
fullfilename
;
else
if
(
wxFileExists
(
wxT
(
"/usr/bin/konqueror"
)
)
)
command
=
wxT
(
"konqueror "
)
+
fullfilename
;
else
if
(
wxFileExists
(
wxT
(
"/usr/bin/gpdf"
)
)
)
command
=
wxT
(
"gpdf "
)
+
fullfilename
;
if
(
command
.
IsEmpty
()
)
// not started
{
DisplayError
(
frame
,
_
(
" Cannot find the PDF viewer (kpdf, gpdf or konqueror) in /usr/bin/"
)
);
success
=
FALSE
;
}
else
ProcessExecute
(
command
);
}
else
#endif
{
Line
.
Printf
(
_
(
"Unknown MIME type for Doc File [%s] (%s)"
),
fullfilename
.
GetData
(),
ext
.
GetData
()
);
DisplayError
(
frame
,
Line
);
}
}
}
else
{
command
=
g_EDA_Appl
->
m_PdfBrowser
;
if
(
wxFileExists
(
command
)
)
{
success
=
TRUE
;
AddDelimiterString
(
fullfilename
);
command
+=
wxT
(
" "
)
+
fullfilename
;
ProcessExecute
(
command
);
}
else
{
Line
.
Printf
(
_
(
"Cannot find Pdf viewer %s"
),
command
.
GetData
()
);
DisplayError
(
frame
,
Line
);
}
}
return
success
;
}
/******************************************************************/
int
KeyWordOk
(
const
wxString
&
KeyList
,
const
wxString
&
Database
)
int
KeyWordOk
(
const
wxString
&
KeyList
,
const
wxString
&
Database
)
/******************************************************************/
/* Recherche si dans le texte Database on retrouve tous les mots
cles donnes dans KeyList ( KeyList = suite de mots cles
separes par des espaces
Retourne:
0 si aucun mot cle trouv
1 si mot cle trouv
*/
*
cles donnes dans KeyList ( KeyList = suite de mots cles
*
separes par des espaces
*
Retourne:
*
0 si aucun mot cle trouv
*
1 si mot cle trouv
*/
{
wxString
KeysCopy
,
DataList
;
if
(
KeyList
.
IsEmpty
()
)
return
(
0
);
KeysCopy
=
KeyList
;
KeysCopy
.
MakeUpper
();
DataList
=
Database
;
DataList
.
MakeUpper
();
wxStringTokenizer
Token
(
KeysCopy
,
wxT
(
"
\n\r
"
));
while
(
Token
.
HasMoreTokens
()
)
{
wxString
Key
=
Token
.
GetNextToken
();
// Search Key in Datalist:
wxStringTokenizer
Data
(
DataList
,
wxT
(
"
\n\r
"
));
while
(
Data
.
HasMoreTokens
()
)
{
wxString
word
=
Data
.
GetNextToken
();
if
(
word
==
Key
)
return
1
;
// Key found !
}
}
// keyword not found
return
(
0
);
}
wxString
KeysCopy
,
DataList
;
if
(
KeyList
.
IsEmpty
()
)
return
0
;
KeysCopy
=
KeyList
;
KeysCopy
.
MakeUpper
();
DataList
=
Database
;
DataList
.
MakeUpper
();
wxStringTokenizer
Token
(
KeysCopy
,
wxT
(
"
\n\r
"
)
);
while
(
Token
.
HasMoreTokens
()
)
{
wxString
Key
=
Token
.
GetNextToken
();
// Search Key in Datalist:
wxStringTokenizer
Data
(
DataList
,
wxT
(
"
\n\r
"
)
);
while
(
Data
.
HasMoreTokens
()
)
{
wxString
word
=
Data
.
GetNextToken
();
if
(
word
==
Key
)
return
1
;
// Key found !
}
}
// keyword not found
return
0
;
}
common/gestfich.cpp
View file @
ba92f94f
...
...
@@ -533,7 +533,7 @@ int ExecuteFile( wxWindow* frame, const wxString& ExecFile, const wxString& para
{
if
(
!
param
.
IsEmpty
()
)
FullFileName
+=
wxT
(
" "
)
+
param
;
wx
Execute
(
FullFileName
);
Process
Execute
(
FullFileName
);
return
0
;
}
...
...
@@ -748,7 +748,7 @@ void OpenPDF( const wxString& file )
}
if
(
!
command
.
IsEmpty
()
)
wx
Execute
(
command
);
Process
Execute
(
command
);
}
...
...
@@ -771,5 +771,5 @@ void OpenFile( const wxString& file )
delete
filetype
;
if
(
success
&&
!
command
.
IsEmpty
()
)
wx
Execute
(
command
);
Process
Execute
(
command
);
}
eeschema/netform.cpp
View file @
ba92f94f
...
...
@@ -342,7 +342,7 @@ void Write_GENERIC_NetList( WinEDA_SchematicFrame* frame,
CommandFile
+=
wxT
(
" "
)
+
TmpFullFileName
;
CommandFile
+=
wxT
(
" "
)
+
FullFileName
;
wx
Execute
(
CommandFile
,
wxEXEC_SYNC
);
Process
Execute
(
CommandFile
,
wxEXEC_SYNC
);
}
...
...
include/common.h
View file @
ba92f94f
...
...
@@ -354,6 +354,18 @@ class WinEDA_DrawPanel;
/* COMMON.CPP */
/**
* Function ProcessExecute
* runs a child process.
* @param aCommandLine The process and any arguments to it all in a single string.
* @param aFlags The same args as allowed for wxExecute()
* @return bool - true if success, else false
*/
bool
ProcessExecute
(
const
wxString
&
aCommandLine
,
int
aFlags
=
wxEXEC_ASYNC
);
wxString
ReturnPcbLayerName
(
int
layer_number
,
bool
is_filename
=
FALSE
);
/* Return the name of the layer number "layer_number".
...
...
@@ -431,10 +443,10 @@ wxString MakeFileName( const wxString& dir,
* dir = prefixe (chemin)
* shortname = nom avec ou sans chemin ou extension
* ext = extension
*
*
* si la chaine name possede deja un chemin ou une extension, elles
* ne seront pas modifiees
*
*
* retourne la chaine calculee */
wxString
MakeReducedFileName
(
const
wxString
&
fullfilename
,
...
...
@@ -445,12 +457,12 @@ wxString MakeReducedFileName( const wxString& fullfilename,
* fullfilename = nom complet
* default_path = prefixe (chemin) par defaut
* default_ext = extension par defaut
*
*
* retourne le nom reduit, c'est a dire:
* sans le chemin si le chemin est default_path
* avec ./ si si le chemin est le chemin courant
* sans l'extension si l'extension est default_ext
*
*
* Renvoie un chemin en notation unix ('/' en separateur de repertoire)
*/
...
...
pcbnew/dialog_freeroute_exchange.cpp
View file @
ba92f94f
...
...
@@ -305,7 +305,7 @@ void dialog_freeroute_exchange::OnButton5Click( wxCommandEvent& event )
if
(
wxFileExists
(
FullFileName
)
)
{
command
<<
wxT
(
"javaws"
)
<<
wxT
(
" "
)
+
FullFileName
;
wx
Execute
(
command
);
Process
Execute
(
command
);
return
;
}
...
...
pcbnew/router.cpp
View file @
ba92f94f
...
...
@@ -134,7 +134,7 @@ void WinEDA_PcbFrame::GlobalRoute( wxDC* DC )
Affiche_Message
(
ExecFileName
);
wx
Execute
(
ExecFileName
);
Process
Execute
(
ExecFileName
);
#else
wxMessageBox
(
wxT
(
"TODO, currently not available"
)
);
...
...
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