Hi,
I'm not sure if this is the right list, if not please redirect me.
So, I tried compiling luametatex using g++, and noticed some things that
prevent it from also being considered valid C++ code.
Two general problems are:
1) Initialization order. C++ wants initializers to be specified in the order in
which they will actually initialize the object, i.e. in the order of the
members.
2) Reserved names. Some variables are named `class` or `template`, which of
course, breaks C++.
But more interesting are the specific pieces of code that get rejected, because
C++ is a bit more strict than C in some cases.
3) We get one complaint about comparing a pointer to an integer using <, which
I believe is an actual bug in the code.
4) A second complaint is about dropping const in `tex_to_cstring`. I don't
think this causes an actual error in the program, though.
5) Some of the `goto`s cause problems, because the jump skips over the
initialization of variables in the target scope. Again, these variables are not
used, so I don't think there is an actual error. The easy fix here is to just
move the code from the `goto` target into its own function, which is probably
better for readability anyway.
6) The last problem is that things break with g++ if the marco `infinity` is
defined.
I've attached patches for 3), 4), and 5), as I think that these benefit code
quality in general. I can also send ones for 1) and 2), if there is interest.
6) seems to be a more general incompatibility, I'm not sure if there is a "fix"
that doesn't require #if s.
Kind regards,
Erik
Index: source/tex/texmlist.c
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/source/tex/texmlist.c b/source/tex/texmlist.c
--- a/source/tex/texmlist.c (revision e065af67f70265bc58297b005c8887aa217c1cde)
+++ b/source/tex/texmlist.c (revision 94c9ec7a07287fa9c63f722be67d96262fb1cf0d)
@@ -1662,7 +1662,7 @@
/*tex integer part of |m| */
*n = tex_x_over_n_r(m, unity, f);
/*tex the new glue specification */
- if (f < 0) {
+ if (*f < 0) {
--n;
f += unity;
}
Index: source/lua/lmttexlib.c
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/source/lua/lmttexlib.c b/source/lua/lmttexlib.c
--- a/source/lua/lmttexlib.c (revision ddfc90669a2f10e64c4635369bcb3c82f7a8adb5)
+++ b/source/lua/lmttexlib.c (revision 1b77819a3301db5a7fddd24551c4e59ba775e459)
@@ -2688,7 +2688,7 @@
default:
{
int texstr = tex_the_scanned_result();
- char *str = tex_to_cstring(texstr);
+ const char *str = tex_to_cstring(texstr);
if (str) {
lua_pushstring(L, str);
} else {
@@ -3580,7 +3580,7 @@
for (int cs = 0; cs < prim_size; cs++) {
strnumber s = get_prim_text(cs);
if (s > 0) {
- char *prm = tex_to_cstring(s);
+ const char *prm = tex_to_cstring(s);
texlib_aux_enableprimitive(pre, lpre, prm);
}
}
Index: source/lua/lmttokenlib.c
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/source/lua/lmttokenlib.c b/source/lua/lmttokenlib.c
--- a/source/lua/lmttokenlib.c (revision ddfc90669a2f10e64c4635369bcb3c82f7a8adb5)
+++ b/source/lua/lmttokenlib.c (revision 1b77819a3301db5a7fddd24551c4e59ba775e459)
@@ -2370,7 +2370,7 @@
while (cs < prim_size) {
strnumber s = get_prim_text(cs);
if (s > 0 && (get_prim_origin(cs) != no_command)) {
- char *ss = tex_to_cstring(s);
+ const char *ss = tex_to_cstring(s);
int cmd = prim_eq_type(cs);
int chr = prim_equiv(cs);
if (! raw) {
Index: source/tex/texmaincontrol.c
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/source/tex/texmaincontrol.c b/source/tex/texmaincontrol.c
--- a/source/tex/texmaincontrol.c (revision ddfc90669a2f10e64c4635369bcb3c82f7a8adb5)
+++ b/source/tex/texmaincontrol.c (revision 1b77819a3301db5a7fddd24551c4e59ba775e459)
@@ -5896,7 +5896,7 @@
strnumber s = tex_aux_scan_string();
if (error_help_par) {
strnumber helpinfo = tex_tokens_to_string(error_help_par);
- char *h = tex_to_cstring(helpinfo);
+ const char *h = tex_to_cstring(helpinfo);
tex_handle_error(
normal_error_type,
"%T",
Index: source/tex/texstringpool.h
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/source/tex/texstringpool.h b/source/tex/texstringpool.h
--- a/source/tex/texstringpool.h (revision ddfc90669a2f10e64c4635369bcb3c82f7a8adb5)
+++ b/source/tex/texstringpool.h (revision 1b77819a3301db5a7fddd24551c4e59ba775e459)
@@ -107,6 +107,6 @@
extern void tex_compact_string_pool (void);
-inline static char *tex_to_cstring (int s) { return str_length(s) > 0 ? (char *) str_string(s) : ""; }
+inline static const char *tex_to_cstring (int s) { return str_length(s) > 0 ? (char *) str_string(s) : ""; }
# endif
Index: source/tex/texscanning.c
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/source/tex/texscanning.c b/source/tex/texscanning.c
--- a/source/tex/texscanning.c (revision 46da4d8a3fda7797830b1385f8e31c19ab0750c3)
+++ b/source/tex/texscanning.c (revision e065af67f70265bc58297b005c8887aa217c1cde)
@@ -1890,6 +1890,18 @@
*/
+static inline void tex_aux_scan_int_nonumber() {
+ /*tex Express astonishment that no number was here */
+ if (lmt_error_state.intercept) {
+ lmt_error_state.last_intercept = 1 ;
+ if (cur_cmd != spacer_cmd) {
+ tex_back_input(cur_tok);
+ }
+ } else {
+ tex_aux_missing_number_error();
+ }
+}
+
halfword tex_scan_int(int optional_equal, int *radix)
{
int negative = 0;
@@ -1959,7 +1971,7 @@
result = tex_aux_scan_something_internal(cur_cmd, cur_chr, int_val_level, 0, 0);
if (cur_val_level != int_val_level) {
result = 0;
- goto NONUMBER;
+ tex_aux_scan_int_nonumber();
}
} else if (cur_cmd == math_style_cmd) {
/* A pity that we need to check this way in |scan_int|. */
@@ -1970,7 +1982,7 @@
result = cur_chr;
} else {
result = 0;
- goto NONUMBER;
+ tex_aux_scan_int_nonumber();
}
} else {
/*tex has an error message been issued? */
@@ -2077,16 +2089,7 @@
}
DONE:
if (vacuous) {
- NONUMBER:
- /*tex Express astonishment that no number was here */
- if (lmt_error_state.intercept) {
- lmt_error_state.last_intercept = 1 ;
- if (cur_cmd != spacer_cmd) {
- tex_back_input(cur_tok);
- }
- } else {
- tex_aux_missing_number_error();
- }
+ tex_aux_scan_int_nonumber();
} else {
tex_push_back(cur_tok, cur_cmd, cur_chr);
}
@@ -3255,6 +3258,16 @@
}
}
+static inline halfword tex_aux_scan_font_id_bad() {
+ tex_handle_error(
+ back_error_type,
+ "Missing or invalid font identifier (or equivalent) or integer (register or otherwise)",
+ "I was looking for a control sequence whose current meaning has been defined by\n"
+ "\\font or a valid font id number."
+ );
+ return null_font;
+}
+
halfword tex_scan_font_identifier(halfword *spec)
{
/*tex Get the next non-blank non-call. */
@@ -3289,7 +3302,7 @@
if (tex_is_valid_font(fnt)) {
return fnt;
} else {
- goto BAD;
+ return tex_aux_scan_font_id_bad();
}
}
case internal_int_cmd:
@@ -3301,7 +3314,7 @@
return fnt;
}
}
- goto BAD;
+ return tex_aux_scan_font_id_bad();
}
default:
{
@@ -3315,14 +3328,7 @@
} else {
/*tex Fall through to a font error message. */
}
- BAD:
- tex_handle_error(
- back_error_type,
- "Missing or invalid font identifier (or equivalent) or integer (register or otherwise)",
- "I was looking for a control sequence whose current meaning has been defined by\n"
- "\\font or a valid font id number."
- );
- return null_font;
+ return tex_aux_scan_font_id_bad();
}
}
}
@@ -4869,7 +4875,7 @@
result = tex_aux_scan_something_internal(cur_cmd, cur_chr, int_val_level, 0, 0);
if (cur_val_level != int_val_level) {
result = 0;
- goto NONUMBER;
+ tex_aux_missing_number_error();
}
} else if (cur_cmd == math_style_cmd) {
result = (cur_chr == yet_unset_math_style) ? tex_scan_math_style_identifier(0, 0) : cur_chr;
@@ -4878,7 +4884,7 @@
result = cur_chr;
} else {
result = 0;
- goto NONUMBER;
+ tex_aux_missing_number_error();
}
} else {
int vacuous = 1;
@@ -4966,7 +4972,6 @@
}
DONE:
if (vacuous) {
- NONUMBER:
tex_aux_missing_number_error();
} else {
tex_push_back(cur_tok, cur_cmd, cur_chr);
_______________________________________________
dev-context mailing list
[email protected]
https://mailman.ntg.nl/mailman/listinfo/dev-context