]> granicus.if.org Git - nethack/commitdiff
win/curses comment
authorPatR <rankin@nethack.org>
Sun, 10 Mar 2019 23:06:29 +0000 (16:06 -0700)
committerPatR <rankin@nethack.org>
Sun, 10 Mar 2019 23:06:29 +0000 (16:06 -0700)
Twice I've gone through the curses code to deal with CHAR_P, BOOLEAN_P,
and so forth.  Both times I eventually changed my mind.  This time I'm
just adding an explanatory comment instead.

win/curses/cursdial.c

index c8ee59808f723e3938c7b827c0299f6ad858dde4..966f15109afbcfc995060413adc14cf1eb85bc84 100644 (file)
 #define strncasecmp strncmpi
 #endif
 
+/*
+ * Note:
+ *
+ *  Prototypes need to use the widened/unwidened type macros (CHAR_P, &c)
+ *  in order to match fields of the window_procs struct (see winprocs.h).
+ *  But for a standard-conforming compiler, we'll end up with the widened
+ *  types necessary to match the mixed prototype/old-style function
+ *  definition environment as used by nethack's core.  Prototype
+int func(CHAR_P);
+ *  becomes
+int func(int);
+ *  after expansion, which matches the definition
+int func(arg) char arg; { ... }
+ *  according to the rules of the C standard.  But the use of new-style
+ *  definitions
+int func(char arg) { ... }
+ *  by the curses interface turns that into a conflict.  No widening takes
+ *  place so it ought to be 'int func(char);' instead.  Unfortunately that
+ *  would be incompatible for functions assigned to window_procs.
+ *
+ *  So, the code here (also cursmain.c and cursinvt.c) is mis-using the
+ *  widening macros for variable types
+int func(CHAR_P arg) { ... }
+ *  (no doubt modelling it after the C++ code in win/Qt where the option
+ *  to switch the applicable definitions to old-style isn't available).
+ *  Other alternatives aren't significantly better so just live with it.
+ *  [Redoing the windowing interface to avoid narrow arguments would be
+ *  better since that would fix Qt's usage too.]
+ */
+
 /* Dialog windows for curses interface */