* "WARNING: parenthesis in function name" correctness
@ 2019-09-10 8:20 Yuri Pankov
2019-09-10 17:47 ` Ingo Schwarze
0 siblings, 1 reply; 4+ messages in thread
From: Yuri Pankov @ 2019-09-10 8:20 UTC (permalink / raw)
To: mandoc-discuss
I'm looking into fixing sbuf.9 which currently has somewhat unreadable:
.Ft typedef\ int ( sbuf_drain_func ) ( void\ *arg, const\ char\ *data,
int\ len ) ;
...into somewhat nicer:
.Ft typedef int
.Fo (sbuf_drain_func)
.Fa "void *arg"
.Fa "const char *data"
.Fa "int len"
.Fc
...but that gives me a:
mandoc: share/man/man9/sbuf.9:69:5: WARNING: parenthesis in function
name: (sbuf_drain_func)
Looking at the code, parenthesis are only allowed in the following form:
.Ft (*func_ptr)
...while here we don't have a "*" -- it's the way it's typedef'ed in the
source, and I want to follow it, so I wonder if that check/warning is
really useful.
--
To unsubscribe send an email to discuss+unsubscribe@mandoc.bsd.lv
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: "WARNING: parenthesis in function name" correctness
2019-09-10 8:20 "WARNING: parenthesis in function name" correctness Yuri Pankov
@ 2019-09-10 17:47 ` Ingo Schwarze
2019-09-10 22:43 ` Yuri Pankov
0 siblings, 1 reply; 4+ messages in thread
From: Ingo Schwarze @ 2019-09-10 17:47 UTC (permalink / raw)
To: Yuri Pankov; +Cc: discuss
Hi Yuri,
Yuri Pankov wrote on Tue, Sep 10, 2019 at 11:20:24AM +0300:
> I'm looking into fixing sbuf.9 which currently has somewhat unreadable:
>
> .Ft typedef\ int ( sbuf_drain_func ) ( void\ *arg, const\ char\ *data,
> int\ len ) ;
Indeed, that is horrible and should be fixed.
> ...into somewhat nicer:
>
> .Ft typedef int
> .Fo (sbuf_drain_func)
> .Fa "void *arg"
> .Fa "const char *data"
> .Fa "int len"
> .Fc
>
> ...but that gives me a:
>
> mandoc: share/man/man9/sbuf.9:69:5: WARNING: parenthesis in function
> name: (sbuf_drain_func)
>
> Looking at the code, parenthesis are only allowed in the following form:
>
> .Ft (*func_ptr)
I think you mean .Fo/.Fn, not .Ft, right?
> ...while here we don't have a "*" -- it's the way it's typedef'ed in the
> source, and I want to follow it, so I wonder if that check/warning is
> really useful.
If i understand the C standard correctly (otherwise, please somebody
correct me!), we have:
int (f)() -- function returning int
int (*fp)() -- pointer to function returning int
In many situations, both can be used interchangeably, consider for
example C89 3.2.2.1: "A function designator is an expression that
has function type. Except when it is the operand of the sizeof
operator or the unary & operator, a function designator with type
``function returning type'' is converted to an expression that has
type ``pointer to function returning type.''"
Then again, it seems for sizeof(), it may make a difference whether
a type is a function type or a function pointer type, and maybe there
are also other situations where that matters.
So i suspect you are right there are legitimate reasons for making
the difference in the documentation, too,
and saying ".Fo (sbuf_drain_func)" looks reasonable.
Do others agree?
I plan to suppress the warning for ".Fo (f)" just like for ".Fo (*f)"
in the future. The likely typo that should be warned about
is ".Fo f()", and that warning will still work.
Yours,
Ingo
--
To unsubscribe send an email to discuss+unsubscribe@mandoc.bsd.lv
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: "WARNING: parenthesis in function name" correctness
2019-09-10 17:47 ` Ingo Schwarze
@ 2019-09-10 22:43 ` Yuri Pankov
2019-09-13 19:31 ` Ingo Schwarze
0 siblings, 1 reply; 4+ messages in thread
From: Yuri Pankov @ 2019-09-10 22:43 UTC (permalink / raw)
To: Ingo Schwarze; +Cc: discuss
Ingo Schwarze wrote:
> Hi Yuri,
>
> Yuri Pankov wrote on Tue, Sep 10, 2019 at 11:20:24AM +0300:
>
>> I'm looking into fixing sbuf.9 which currently has somewhat unreadable:
>>
>> .Ft typedef\ int ( sbuf_drain_func ) ( void\ *arg, const\ char\ *data,
>> int\ len ) ;
>
> Indeed, that is horrible and should be fixed.
>
>> ...into somewhat nicer:
>>
>> .Ft typedef int
>> .Fo (sbuf_drain_func)
>> .Fa "void *arg"
>> .Fa "const char *data"
>> .Fa "int len"
>> .Fc
>>
>> ...but that gives me a:
>>
>> mandoc: share/man/man9/sbuf.9:69:5: WARNING: parenthesis in function
>> name: (sbuf_drain_func)
>>
>> Looking at the code, parenthesis are only allowed in the following form:
>>
>> .Ft (*func_ptr)
>
> I think you mean .Fo/.Fn, not .Ft, right?
Yes, I was thinking about .Fo, sorry.
>> ...while here we don't have a "*" -- it's the way it's typedef'ed in the
>> source, and I want to follow it, so I wonder if that check/warning is
>> really useful.
>
> If i understand the C standard correctly (otherwise, please somebody
> correct me!), we have:
>
> int (f)() -- function returning int
> int (*fp)() -- pointer to function returning int
>
> In many situations, both can be used interchangeably, consider for
> example C89 3.2.2.1: "A function designator is an expression that
> has function type. Except when it is the operand of the sizeof
> operator or the unary & operator, a function designator with type
> ``function returning type'' is converted to an expression that has
> type ``pointer to function returning type.''"
>
> Then again, it seems for sizeof(), it may make a difference whether
> a type is a function type or a function pointer type, and maybe there
> are also other situations where that matters.
>
> So i suspect you are right there are legitimate reasons for making
> the difference in the documentation, too,
> and saying ".Fo (sbuf_drain_func)" looks reasonable.
> Do others agree?
>
> I plan to suppress the warning for ".Fo (f)" just like for ".Fo (*f)"
> in the future. The likely typo that should be warned about
> is ".Fo f()", and that warning will still work.
Sounds good, thank you!
--
To unsubscribe send an email to discuss+unsubscribe@mandoc.bsd.lv
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: "WARNING: parenthesis in function name" correctness
2019-09-10 22:43 ` Yuri Pankov
@ 2019-09-13 19:31 ` Ingo Schwarze
0 siblings, 0 replies; 4+ messages in thread
From: Ingo Schwarze @ 2019-09-13 19:31 UTC (permalink / raw)
To: Yuri Pankov; +Cc: discuss
Hi Yuri,
Yuri Pankov wrote on Wed, Sep 11, 2019 at 01:43:22AM +0300:
> Ingo Schwarze wrote:
>> I plan to suppress the warning for ".Fo (f)" just like for ".Fo (*f)"
>> in the future. The likely typo that should be warned about
>> is ".Fo f()", and that warning will still work.
> Sounds good, thank you!
Committed, see below.
Thanks again for the report!
Ingo
Log Message:
-----------
Improve validation of function names:
1. Relax checking to accept function types of the form
"ret_type (fname)(args)" (suggested by Yuri Pankov <yuripv dot net>).
2. Tighten checking to require the closing parenthesis.
Modified Files:
--------------
mandoc:
mdoc_validate.c
mandoc/regress/mdoc/Fo:
warn.in
warn.out_ascii
warn.out_lint
warn.out_markdown
Revision Data
-------------
Index: mdoc_validate.c
===================================================================
RCS file: /home/cvs/mandoc/mandoc/mdoc_validate.c,v
retrieving revision 1.374
retrieving revision 1.375
diff -Lmdoc_validate.c -Lmdoc_validate.c -u -p -r1.374 -r1.375
--- mdoc_validate.c
+++ mdoc_validate.c
@@ -1186,11 +1186,17 @@ post_fname(POST_ARGS)
size_t pos;
n = mdoc->last->child;
- pos = strcspn(n->string, "()");
- cp = n->string + pos;
- if ( ! (cp[0] == '\0' || (cp[0] == '(' && cp[1] == '*')))
- mandoc_msg(MANDOCERR_FN_PAREN, n->line, n->pos + pos,
- "%s", n->string);
+ cp = n->string;
+ if (*cp == '(') {
+ if (cp[strlen(cp + 1)] == ')')
+ return;
+ pos = 0;
+ } else {
+ pos = strcspn(cp, "()");
+ if (cp[pos] == '\0')
+ return;
+ }
+ mandoc_msg(MANDOCERR_FN_PAREN, n->line, n->pos + pos, "%s", cp);
}
static void
Index: warn.in
===================================================================
RCS file: /home/cvs/mandoc/mandoc/regress/mdoc/Fo/warn.in,v
retrieving revision 1.2
retrieving revision 1.3
diff -Lregress/mdoc/Fo/warn.in -Lregress/mdoc/Fo/warn.in -u -p -r1.2 -r1.3
--- regress/mdoc/Fo/warn.in
+++ regress/mdoc/Fo/warn.in
@@ -1,4 +1,4 @@
-.\" $OpenBSD: warn.in,v 1.2 2017/07/04 14:53:25 schwarze Exp $
+.\" $OpenBSD: warn.in,v 1.3 2019/09/13 19:18:48 schwarze Exp $
.Dd $Mdocdate$
.Dt FO-WARN 1
.Os
@@ -12,3 +12,17 @@
.Fc
.Ft double
.Fn atan2 "double y, double x"
+.Ft int
+.Fn close) "int fd"
+.Ft typedef void
+.Fn (handler) int
+.Ft typedef void
+.Fn (*fp) int
+.Ft int
+.Fn (open "const char *path"
+.Ft FILE *
+.Fn (*popen "const char *cmd"
+.Ft void
+.Fn (trail)x void
+.Ft void
+.Fn *star void
Index: warn.out_markdown
===================================================================
RCS file: /home/cvs/mandoc/mandoc/regress/mdoc/Fo/warn.out_markdown,v
retrieving revision 1.2
retrieving revision 1.3
diff -Lregress/mdoc/Fo/warn.out_markdown -Lregress/mdoc/Fo/warn.out_markdown -u -p -r1.2 -r1.3
--- regress/mdoc/Fo/warn.out_markdown
+++ regress/mdoc/Fo/warn.out_markdown
@@ -12,4 +12,25 @@ FO-WARN(1) - General Commands Manual
*double*
**atan2**(*double y, double x*);
-OpenBSD - July 4, 2017
+*int*
+**close)**(*int fd*);
+
+*typedef void*
+**(handler)**(*int*);
+
+*typedef void*
+**(\*fp)**(*int*);
+
+*int*
+**(open**(*const char \*path*);
+
+*FILE \*‌*
+**(\*popen**(*const char \*cmd*);
+
+*void*
+**(trail)x**(*void*);
+
+*void*
+**\*star**(*void*);
+
+OpenBSD - September 13, 2019
Index: warn.out_lint
===================================================================
RCS file: /home/cvs/mandoc/mandoc/regress/mdoc/Fo/warn.out_lint,v
retrieving revision 1.5
retrieving revision 1.6
diff -Lregress/mdoc/Fo/warn.out_lint -Lregress/mdoc/Fo/warn.out_lint -u -p -r1.5 -r1.6
--- regress/mdoc/Fo/warn.out_lint
+++ regress/mdoc/Fo/warn.out_lint
@@ -1,2 +1,6 @@
mandoc: warn.in:10:8: WARNING: parenthesis in function name: sin()
mandoc: warn.in:14:19: WARNING: comma in function argument: double y, double x
+mandoc: warn.in:16:10: WARNING: parenthesis in function name: close)
+mandoc: warn.in:22:5: WARNING: parenthesis in function name: (open
+mandoc: warn.in:24:5: WARNING: parenthesis in function name: (*popen
+mandoc: warn.in:26:5: WARNING: parenthesis in function name: (trail)x
Index: warn.out_ascii
===================================================================
RCS file: /home/cvs/mandoc/mandoc/regress/mdoc/Fo/warn.out_ascii,v
retrieving revision 1.2
retrieving revision 1.3
diff -Lregress/mdoc/Fo/warn.out_ascii -Lregress/mdoc/Fo/warn.out_ascii -u -p -r1.2 -r1.3
--- regress/mdoc/Fo/warn.out_ascii
+++ regress/mdoc/Fo/warn.out_ascii
@@ -10,4 +10,25 @@ S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
_\bd_\bo_\bu_\bb_\bl_\be
a\bat\bta\ban\bn2\b2(_\bd_\bo_\bu_\bb_\bl_\be _\by_\b, _\bd_\bo_\bu_\bb_\bl_\be _\bx);
-OpenBSD July 4, 2017 OpenBSD
+ _\bi_\bn_\bt
+ c\bcl\blo\bos\bse\be)\b)(_\bi_\bn_\bt _\bf_\bd);
+
+ _\bt_\by_\bp_\be_\bd_\be_\bf _\bv_\bo_\bi_\bd
+ (\b(h\bha\ban\bnd\bdl\ble\ber\br)\b)(_\bi_\bn_\bt);
+
+ _\bt_\by_\bp_\be_\bd_\be_\bf _\bv_\bo_\bi_\bd
+ (\b(*\b*f\bfp\bp)\b)(_\bi_\bn_\bt);
+
+ _\bi_\bn_\bt
+ (\b(o\bop\bpe\ben\bn(_\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bp_\ba_\bt_\bh);
+
+ _\bF_\bI_\bL_\bE _\b*
+ (\b(*\b*p\bpo\bop\bpe\ben\bn(_\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bc_\bm_\bd);
+
+ _\bv_\bo_\bi_\bd
+ (\b(t\btr\bra\bai\bil\bl)\b)x\bx(_\bv_\bo_\bi_\bd);
+
+ _\bv_\bo_\bi_\bd
+ *\b*s\bst\bta\bar\br(_\bv_\bo_\bi_\bd);
+
+OpenBSD September 13, 2019 OpenBSD
--
To unsubscribe send an email to discuss+unsubscribe@mandoc.bsd.lv
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2019-09-13 19:31 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-09-10 8:20 "WARNING: parenthesis in function name" correctness Yuri Pankov
2019-09-10 17:47 ` Ingo Schwarze
2019-09-10 22:43 ` Yuri Pankov
2019-09-13 19:31 ` Ingo Schwarze
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).