Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
c5f834ce
Commit
c5f834ce
authored
Aug 08, 2003
by
Patrik Stridvall
Committed by
Alexandre Julliard
Aug 08, 2003
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
- API files update.
- Minor bug fixes.
parent
c0a3cb13
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
594 additions
and
83 deletions
+594
-83
config.pm
tools/winapi/config.pm
+2
-2
win16.api
tools/winapi/win16.api
+88
-9
win32.api
tools/winapi/win32.api
+406
-25
winapi.pm
tools/winapi/winapi.pm
+9
-22
modules.dat
tools/winapi_check/modules.dat
+14
-0
nativeapi.pm
tools/winapi_check/nativeapi.pm
+20
-5
preprocessor.pm
tools/winapi_check/preprocessor.pm
+28
-13
winapi_check
tools/winapi_check/winapi_check
+20
-3
winapi_documentation.pm
tools/winapi_check/winapi_documentation.pm
+3
-2
winapi_global.pm
tools/winapi_check/winapi_global.pm
+1
-0
winapi_parser.pm
tools/winapi_check/winapi_parser.pm
+3
-2
No files found.
tools/winapi/config.pm
View file @
c5f834ce
...
...
@@ -53,7 +53,7 @@ sub file_type {
m%^(?:libtest|rc|server|tests|tools)/%
&&
return
""
;
m%^(?:programs|debugger|miscemu)/%
&&
return
"wineapp"
;
m%^(?:lib
rary|tsx11|unicode
)/%
&&
return
"library"
;
m%^(?:lib
s
)/%
&&
return
"library"
;
m%^windows/x11drv/wineclipsrv\.c$%
&&
return
"application"
;
return
"winelib"
;
...
...
@@ -78,7 +78,7 @@ sub file_skip {
$_
=
file_absolutize
(
$_
);
m%^(?:libtest|programs|rc|server|tests|tools)/%
&&
return
1
;
m%^(?:debugger|miscemu|
tsx11|server|unicode
)/%
&&
return
1
;
m%^(?:debugger|miscemu|
libs|server
)/%
&&
return
1
;
m%^dlls/wineps/data/%
&&
return
1
;
m%^windows/x11drv/wineclipsrv\.c$%
&&
return
1
;
m%^dlls/winmm/wineoss/midipatch\.c$%
&&
return
1
;
...
...
tools/winapi/win16.api
View file @
c5f834ce
...
...
@@ -2,24 +2,33 @@
%long
BOOL
DWORD
HRESULT
INT
LONG
UINT
ULONG
%ptr
LPAVICOMPRESSOPTIONS *
LPAVIFILEINFOA
LPAVISTREAMINFOA
LPBITMAPINFOHEADER
LPCLSID
LPLONG
LPVOID
PAVIFILE
PAVIFILE *
PAVISTREAM
PAVISTREAM *
PGETFRAME
%str
LPCSTR
LPSTR
%void
...
...
@@ -114,6 +123,55 @@ HTASK16
INT16
WORD
%%ctl3d.dll
%long
DWORD
HBRUSH
LONG
LPARAM
%void
void
%word
BOOL16
HDC16
HINSTANCE16
HWND16
INT16
UINT16
WORD
WPARAM16
%%ctl3dv2.dll
%long
DWORD
HBRUSH
LONG
LPARAM
LRESULT
%void
void
%word
BOOL16
HDC16
HINSTANCE16
HWND16
INT16
UINT16
WORD
WPARAM16
%%ddeml.dll
%long
...
...
@@ -218,16 +276,13 @@ LPBYTE
LPCVOID
LPDEVMODEA
LPDWORD
LPENUMLOGFONT16
LPFONTINFO16
LPGLYPHMETRICS16
LPINT16
LPKERNINGPAIR16
LPLOGFONT16
LPNEWTEXTMETRIC16
LPOUTLINETEXTMETRIC16
LPPALETTEENTRY
LPPDEVICE
LPPOINT16
LPRASTERIZER_STATUS
LPRECT16
...
...
@@ -294,6 +349,7 @@ BOOL
DWORD
HANDLE
HINSTANCE
HKEY
HMODULE
INT
LONG
...
...
@@ -350,7 +406,6 @@ HANDLE16
HFILE16
HGLOBAL16
HINSTANCE16
HKEY
HLOCAL16
HMODULE16
HQUEUE16
...
...
@@ -411,7 +466,6 @@ LPVOID
%str
LPCSTR
LPSTR
%void
...
...
@@ -621,13 +675,29 @@ WORD
DWORD
HRESULT
ULONG
%longlong
ULARGE_INTEGER
%ptr
IDataObject *
IDataObject **
ILockBytes16 *
LPDROPTARGET
LPLOCKBYTES16 *
LPMONIKER *
LPRUNNINGOBJECTTABLE *
LPVOID
LPVOID *
REFIID
REFCLSID
STATSTG16 *
ULONG *
void *
void **
%str
...
...
@@ -639,6 +709,7 @@ void
%word
BOOL16
HGLOBAL16
HICON16
HWND16
...
...
@@ -766,21 +837,26 @@ OLE_SERVER_USE
BOOL
DWORD
HKEY
LPARAM
WPARAM
int
%ptr
HINF16 *
LPBYTE
LPDEVICE_INFO16
LPDWORD
LPEXPANDVTBL
LPHKEY16
LPLOGDISKDESC
LPLPDEVICE_INFO16
LPVIRTNODE
LPVOID
PHKEY
VIFPROC
VOID *
%str
...
...
@@ -795,7 +871,7 @@ void
HINF16
HINSTANCE16
HKEY
HKEY
16
HWND16
INT16
LOGDISKID16
...
...
@@ -803,7 +879,6 @@ RETERR16
UINT16
VHSTR
WORD
WPARAM
%%shell.dll
...
...
@@ -811,6 +886,7 @@ WPARAM
BOOL
DWORD
HKEY
LPARAM
LRESULT
...
...
@@ -841,7 +917,6 @@ HDROP16
HGLOBAL16
HICON16
HINSTANCE16
HKEY
HWND16
INT16
UINT16
...
...
@@ -881,6 +956,7 @@ LARGE_INTEGER
%ptr
IID *
ILockBytes16 *
IStorage16 *
IStorage16 **
IStream16 *
...
...
@@ -894,6 +970,10 @@ ULARGE_INTEGER *
ULONG *
void *
%segptr
SEGPTR
%str
LPCOLESTR16
...
...
@@ -1010,7 +1090,6 @@ BOOL
COLORREF
DWORD
HHOOK
INT
LONG
LPARAM
LRESULT
...
...
tools/winapi/win32.api
View file @
c5f834ce
This diff is collapsed.
Click to expand it.
tools/winapi/winapi.pm
View file @
c5f834ce
...
...
@@ -257,7 +257,7 @@ sub parse_spec_file {
s/^\s*(.*?)\s*$/$1/
;
if
(
s/^(.*?)\s*\#\s*(.*)\s*$/$1/
)
{
my
$comment
=
$2
;
if
(
$comment
=~
/^Wine/
)
{
# FIXME: Kludge
if
(
$comment
=~
/^Wine/
i
)
{
# FIXME: Kludge
$wine_extension
=
1
;
}
}
...
...
@@ -271,7 +271,7 @@ sub parse_spec_file {
my
$ordinal
;
if
(
/^
(
\
d
+|
@
)
\
s
+
(
pascal
|
pascal16
|
stdcall
|
cdecl
|
varargs
)
\
s
+
((?:(?:
-
noimport
|-
noname
|-
norelay
|-
i386
|-
ret64
|-
register
|-
interrupt
)
\
s
+
)
*
)(
\
S
+
)
\
s
*\
(
\
s
*
(
.*
?)
\
s
*\
)
\
s
*
(
\
S
*
)
$
/
x
)
((?:(?:
-
noimport
|-
noname
|-
norelay
|-
i386
|-
ret64
|-
register
|-
interrupt
|-
private
)
\
s
+
)
*
)(
\
S
+
)
\
s
*\
(
\
s
*
(
.*
?)
\
s
*\
)
\
s
*
(
\
S
*
)
$
/
x
)
{
my
$calling_convention
=
$2
;
my
$flags
=
$3
;
...
...
@@ -283,6 +283,8 @@ sub parse_spec_file {
$flags
=~
s/\s+/ /g
;
$internal_name
=
$external_name
if
!
$internal_name
;
if
(
$flags
=~
/-noname/
)
{
# $external_name = "@";
}
...
...
@@ -294,7 +296,7 @@ sub parse_spec_file {
}
if
(
$internal_name
=~
/^(.*?)\.(.*?)$/
)
{
my
$forward_module
=
$1
;
my
$forward_module
=
lc
(
$1
)
;
my
$forward_name
=
$2
;
if
(
0
)
{
...
...
@@ -378,7 +380,7 @@ sub parse_spec_file {
}
}
}
}
elsif
(
/^(\d+|@)\s+stub(?:\s+(-noimport|-noname|-norelay|-i386|-ret64))?\s+(\S+)$/
)
{
}
elsif
(
/^(\d+|@)\s+stub(?:\s+(-noimport|-noname|-norelay|-i386|-ret64
|-private
))?\s+(\S+)$/
)
{
$ordinal
=
$1
;
my
$flags
=
$2
;
...
...
@@ -427,25 +429,14 @@ sub parse_spec_file {
}
else
{
# if($$function_external_module{$external_name} !~ /$module/) {
$$function_external_module
{
$external_name
}
.=
" & $module"
;
}
}
elsif
(
/^(\d+|@)\s+forward(?:\s+(?:-noimport|-norelay|-i386|-ret64))?\s+(\S+)\s+(\S+)\.(\S+)$/
)
{
$ordinal
=
$1
;
my
$external_name
=
$2
;
my
$forward_module
=
lc
(
$3
);
my
$forward_name
=
$4
;
if
(
$external_name
ne
"@"
)
{
$$module_external_calling_convention
{
$module
}{
$external_name
}
=
"forward"
;
}
else
{
$$module_external_calling_convention
{
$module
}{
"\@$ordinal"
}
=
"forward"
;
}
$$function_forward
{
$module
}{
$external_name
}
=
[
$forward_module
,
$forward_name
];
}
elsif
(
/^(\d+|@)\s+extern\s+(\S+)\s*(\S*)$/
)
{
}
elsif
(
/^(\d+|@)\s+extern(?:\s+(?:-noimport|-norelay|-i386|-ret64))?\s+(\S+)\s*(\S*)$/
)
{
$ordinal
=
$1
;
my
$external_name
=
$2
;
my
$internal_name
=
$3
;
$internal_name
=
$external_name
if
!
$internal_name
;
if
(
$external_name
ne
"@"
)
{
$$module_external_calling_convention
{
$module
}{
$external_name
}
=
"extern"
;
}
else
{
...
...
@@ -928,17 +919,13 @@ sub function_wine_extension {
sub
is_function_stub
{
my
$self
=
shift
;
my
$module_external_calling_convention
=
\%
{
$self
->
{
MODULE_EXTERNAL_CALLING_CONVENTION
}};
my
$modules
=
\%
{
$self
->
{
MODULES
}};
my
$module
=
shift
;
my
$name
=
shift
;
foreach
my
$module
(
keys
(
%
$modules
))
{
if
(
$$module_external_calling_convention
{
$module
}{
$name
}
eq
"stub"
)
{
return
1
;
}
}
return
0
;
}
...
...
tools/winapi_check/modules.dat
View file @
c5f834ce
...
...
@@ -46,8 +46,12 @@ dlls/crypt32
% dlls/ctl3d/ctl3d.spec
dlls/ctl3d
% dlls/ctl3d/ctl3d32.spec
dlls/ctl3d
% dlls/ctl3d/ctl3dv2.spec
dlls/ctl3d
...
...
@@ -64,6 +68,10 @@ dlls/d3d8
dlls/d3d9
% dlls/d3dim/d3dim.spec
dlls/d3dim
% dlls/d3dx8/d3dx8.spec
dlls/d3dx8
...
...
@@ -240,6 +248,10 @@ dlls/msvcrt20
dlls/msvcrtd
% dlls/mswsock/mswsock.spec
dlls/mswsock
% dlls/kernel/stress.spec
dlls/kernel
...
...
@@ -306,6 +318,8 @@ dlls/msacm/winemp3
% dlls/msnet32/msnet32.spec
dlls/msnet32
% dlls/msvideo/msvfw32.spec
dlls/msvideo
...
...
tools/winapi_check/nativeapi.pm
View file @
c5f834ce
...
...
@@ -54,6 +54,9 @@ sub new {
$configure_ac_file
=~
s/^\.\///
;
$config_h_in_file
=~
s/^\.\///
;
$$conditional_headers
{
"config.h"
}
++
;
$output
->
progress
(
"$api_file"
);
open
(
IN
,
"< $api_file"
);
...
...
@@ -101,16 +104,28 @@ sub new {
# skip comments
if
(
/^dnl/
)
{
next
;
}
if
(
/^AC_CHECK_HEADERS\(\s*([^,\)]*)(?:,|\))?/
)
{
foreach
my
$name
(
split
(
/\s+/
,
$1
))
{
if
(
/AC_CHECK_HEADERS\(\s*([^,\)]*)(?:,|\))?/
)
{
my
$headers
=
$1
;
$headers
=~
s/^\s*\[\s*(.*?)\s*\]\s*$/$1/
;
foreach
my
$name
(
split
(
/\s+/
,
$headers
))
{
$$conditional_headers
{
$name
}
++
;
}
}
elsif
(
/^AC_CHECK_FUNCS\(\s*([^,\)]*)(?:,|\))?/
)
{
foreach
my
$name
(
split
(
/\s+/
,
$1
))
{
}
elsif
(
/AC_CHECK_FUNCS\(\s*([^,\)]*)(?:,|\))?/
)
{
my
$funcs
=
$1
;
$funcs
=~
s/^\s*\[\s*(.*?)\s*\]\s*$/$1/
;
foreach
my
$name
(
split
(
/\s+/
,
$funcs
))
{
$$conditional_functions
{
$name
}
++
;
}
}
elsif
(
/
^
AC_FUNC_ALLOCA/
)
{
}
elsif
(
/AC_FUNC_ALLOCA/
)
{
$$conditional_headers
{
"alloca.h"
}
++
;
}
elsif
(
/AC_DEFINE\(\s*HAVE_(.*?)_H/
)
{
my
$name
=
lc
(
$1
);
$name
=~
s/_/\//
;
$name
.=
".h"
;
next
if
$name
=~
m%correct/%
;
$$conditional_headers
{
$name
}
++
;
}
}
...
...
tools/winapi_check/preprocessor.pm
View file @
c5f834ce
...
...
@@ -79,27 +79,42 @@ sub begin_if {
local
$_
=
shift
;
while
(
!
/^$/
)
{
if
(
/^0\s*\&\&/
)
{
if
(
/^0\s*\&\&/
s
)
{
$_
=
"0"
;
}
elsif
(
/^1\s*\|\|/
)
{
}
elsif
(
/^1\s*\|\|/
s
)
{
$_
=
"1"
;
}
if
(
/^(!)?defined\s*\(\s*(.+?)\s*\)\s*((\&\&|\|\|)\s*)?/
){
if
(
/^(!\s*)?defined\s*\(\s*(\w+)\s*\)\s*(?:(\&\&|\|\|)\s*)?/s
||
/^(!\s*)?defined\s*(\w+)\s*(?:(\&\&|\|\|)\s*)?/s
)
{
$_
=
$'
;
if
(
defined
(
$1
)
&&
$1
eq
"!"
)
{
$self
->
undefine
(
$2
);
push
@$stack
,
$2
;
my
$sign
=
$1
;
my
$var
=
$2
;
if
(
defined
(
$sign
)
&&
$sign
eq
"!"
)
{
$self
->
undefine
(
$var
);
push
@$stack
,
$var
;
}
else
{
$self
->
define
(
$
2
);
push
@$stack
,
$
2
;
$self
->
define
(
$
var
);
push
@$stack
,
$
var
;
}
}
elsif
(
/^(\w+)\s*(<|<=|==|!=|>=|>)\s*(\w+)\s*((\&\&|\|\|)\s*)?/
)
{
$_
=
$'
;
}
elsif
(
/^(!)?(\w+)\s*$/
)
{
$_
=
$'
;
}
elsif
(
/^\(|\)/
)
{
}
elsif
(
/^(!\s*)?(\w+)\s*(?:(<|<=|==|!=|>=|>|\+|\-|\*\/)\s*(\w+)\s*)?(?:(\&\&|\|\|)\s*)?/s
)
{
$_
=
$'
;
my
$sign
=
$1
;
my
$var
=
$2
;
if
(
defined
(
$sign
)
&&
$sign
eq
"!"
)
{
$self
->
undefine
(
$var
);
push
@$stack
,
$var
;
}
else
{
$self
->
define
(
$var
);
push
@$stack
,
$var
;
}
}
elsif
(
/^(!\s*)?\(/s
)
{
$_
=
""
;
}
else
{
print
"*** Can't parse '#$directive $_' ***\n"
;
$_
=
""
;
...
...
tools/winapi_check/winapi_check
View file @
c5f834ce
...
...
@@ -538,9 +538,14 @@ foreach my $file (@c_files) {
}
else
{
$include
=
"$header"
;
}
}
elsif
(
$header
=~
/^(?:\.\.\/kernel\/(kernel_private\.h))$/
)
{
# FIXME: Kludge
my
$header2
=
$1
;
$include
=
"dlls/kernel/$header2"
;
}
elsif
(
$header
=~
/^(?:ntdll_misc\.h)$/
)
{
# FIXME: Kludge
$include
=
"dlls/ntdll/$header"
;
}
elsif
(
$header
=~
/^(?:controls\.h|message\.h)$/
)
{
# FIXME: Kludge
$include
=
"dlls/user/$header"
;
}
elsif
(
$header
=~
/^(?:ts_xlib\.h|winproc\.h|x11
font\.h|
)$/
)
{
# FIXME: Kludge
}
elsif
(
$header
=~
/^(?:ts_xlib\.h|winproc\.h|x11
drv\.h|x11font\.h
)$/
)
{
# FIXME: Kludge
$include
=
"dlls/x11drv/$header"
;
}
elsif
(
$check_local
&&
$header
ne
"config.h"
)
{
$output
->
write
(
"$file: #include \"$header\": file not found\n"
);
...
...
@@ -613,14 +618,26 @@ foreach my $file (@c_files) {
$include2info
{
$name
}{
used
}
++
;
}
}
}
elsif
(
$header
=~
/^(?:\.\.\/kernel\/(kernel_private\.h))$/
)
{
# FIXME: Kludge
my
$header2
=
$1
;
$include2info
{
"dlls/kernel/$header2"
}{
used
}
++
;
foreach
my
$name
(
keys
(
%
{
$include2info
{
"dlls/kernel/$header2"
}{
includes
}}))
{
$include2info
{
$name
}{
used
}
++
;
}
}
elsif
(
$header
=~
/^(?:ntdll_misc\.h)$/
)
{
# FIXME: Kludge
$include2info
{
"dlls/ntdll/$header"
}{
used
}
++
;
foreach
my
$name
(
keys
(
%
{
$include2info
{
"dlls/ntdll/$header"
}{
includes
}}))
{
$include2info
{
$name
}{
used
}
++
;
}
}
elsif
(
$header
=~
/^(?:controls\.h|message\.h)$/
)
{
# FIXME: Kludge
$include2info
{
"dlls/user/$header"
}{
used
}
++
;
foreach
my
$name
(
keys
(
%
{
$include2info
{
"dlls/user/$header"
}{
includes
}}))
{
$include2info
{
$name
}{
used
}
++
;
}
}
elsif
(
$header
=~
/^(?:ts_xlib\.h|winproc\.h|x11
font\.h|
)$/
)
{
# FIXME: Kludge
}
elsif
(
$header
=~
/^(?:ts_xlib\.h|winproc\.h|x11
drv\.h|x11font\.h
)$/
)
{
# FIXME: Kludge
$include2info
{
"dlls/x11drv/$header"
}{
used
}
++
;
foreach
my
$name
(
keys
(
%
{
$include2info
{
"dlls/
user
/$header"
}{
includes
}}))
{
foreach
my
$name
(
keys
(
%
{
$include2info
{
"dlls/
x11drv
/$header"
}{
includes
}}))
{
$include2info
{
$name
}{
used
}
++
;
}
}
elsif
(
-
e
"$wine_dir/include/$header"
)
{
...
...
tools/winapi_check/winapi_documentation.pm
View file @
c5f834ce
...
...
@@ -87,7 +87,7 @@ sub check_documentation {
my
$ordinal2
=
$7
;
if
(
$winapi
->
function_wine_extension
(
lc
(
$module2
),
$external_name2
))
{
$output
->
write
(
"documentation: $external_name2 (\U$module2\E.$ordinal2) is a Wine extension \\\n$documentation\n"
);
#
$output->write("documentation: $external_name2 (\U$module2\E.$ordinal2) is a Wine extension \\\n$documentation\n");
}
if
(
length
(
$1
)
!=
1
||
length
(
$2
)
<
1
||
...
...
@@ -108,6 +108,7 @@ sub check_documentation {
}
if
(((
$options
->
documentation_name
&&
!
$found_name
)
||
(
$options
->
documentation_ordinal
&&
!
$found_ordinal
))
&&
!
$winapi
->
is_function_stub
(
$module
,
$external_name
)
&&
!
$winapi
->
function_wine_extension
(
$module
,
$external_name
))
{
$documentation_error
=
1
;
...
...
@@ -202,7 +203,7 @@ sub check_documentation {
for
my
$argument_documentation
(
@$refargument_documentations
)
{
$n
++
;
if
(
$argument_documentation
ne
""
)
{
if
(
$argument_documentation
!~
/^\/\*\s+\[(?:in|out|in\/out|\?\?\?)\].*?\*\/$/s
)
{
if
(
$argument_documentation
!~
/^\/\*\s+\[(?:in|out|in\/out|\?\?\?
|I|O|I\/O
)\].*?\*\/$/s
)
{
$output
->
write
(
"argument $n documentation: \\\n$argument_documentation\n"
);
}
}
...
...
tools/winapi_check/winapi_global.pm
View file @
c5f834ce
...
...
@@ -38,6 +38,7 @@ sub check_modules {
if
(
!
$winapi
->
is_module
(
$module
))
{
next
;
}
my
$functions
=
$$module2functions
{
$module
};
foreach
my
$internal_name
(
$winapi
->
all_internal_functions_in_module
(
$module
))
{
next
if
$internal_name
=~
/\./
;
my
$function
=
$functions
->
{
$internal_name
};
if
(
!
defined
(
$function
)
&&
!
$nativeapi
->
is_function
(
$internal_name
)
&&
!
(
$module
eq
"user"
&&
$internal_name
=~
...
...
tools/winapi_check/winapi_parser.pm
View file @
c5f834ce
...
...
@@ -221,7 +221,8 @@ sub parse_c_file {
# remove preprocessor directives
if
(
s/^\s*\#/\#/s
)
{
if
(
/^\#.*?\\$/s
)
{
if
(
/^(\#.*?)\\$/s
)
{
$_
=
"$1\n"
;
$lookahead
=
1
;
next
;
}
elsif
(
s/^\#\s*(\w+)((?:\s+(.*?))?\s*)$//s
)
{
...
...
@@ -533,7 +534,7 @@ sub parse_c_file {
((?:
const
\
s
+|
enum
\
s
+|
long
\
s
+|
signed
\
s
+|
short
\
s
+|
struct
\
s
+|
union
\
s
+|
unsigned
\
s
+
)
*
?)
(
\
w
+
)
(?:
\
s
+
const
)?
((?:
\
s
*\*+\
s
*|\
s
+
)
\
w
+\
s
*
(?:
\
[[
^\
]]
*\
])
?
((?:
\
s
*\*+\
s
*|\
s
+
)
\
w
+\
s
*
(?:
\
[[
^\
]]
*\
])
*
(?:
\
s
*
,
\
s
*
(?:
\
s
*\*+\
s
*|\
s
+
)
\
w
+\
s
*
(?:
\
[[
^\
]]
*\
])?)
*
)
\
s
*
;
/
sx
)
{
...
...
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