Re: format and eval

Eric Blake <[email protected]>
Newsgroups gmane.comp.gnu.m4.patches
Message-ID <[email protected]>
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

According to Eric Blake on 1/6/2007 12:52 PM:
> Part 2.  Add >>> (Java's unsigned right shift, since eval is always signed
> math), ?: and , to head's eval, and forward port all improvements from the
> branch.

Part 3.  Add some documentation examples for mpeval.  Also, slightly
unrelated other than the fact that I used it in part 2 for deciding when
?: is valid, consolidate no_gnu_extensions and posixly_correct into the
same bit, since they were always the same value.

2007-01-09  Eric Blake  <[email protected]>

	* doc/m4.texinfo (Mpeval): Add tests.
	* tests/testsuite.at (AT_CHECK_GMP): New filter, factored from...
	* tests/builtins.at (gmp): ...here.  Rename test to...
	(mpeval): ...this.
	* tests/generate.awk (new_test): Filter out mpeval tests when gmp
	is not available.
	* m4/m4module.h (m4_get_no_gnu_extensions_opt): Merge
	no_gnu_extensions with posixly_correct_opt, since they were set in
	sync.
	* m4/m4private.h (struct m4): Remove no_gnu_extensions.
	* src/main.c (main): Update caller.
	* src/freeze.c (reload_frozen_state): Likewise.
	* modules/m4.c (m4wrap): Likewise.

- --
Don't work too hard, make some time for fun as well!

Eric Blake             [email protected]
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFFo6Tu84KuGfSFAYARAvmoAKDDtK50Z54VXcNQmzxp/L2ngJAp9wCgs0Db
UOZvI6mFJcwJrNorRSEumqI=
=CeBJ
-----END PGP SIGNATURE-----

_______________________________________________
M4-patches mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/m4-patches
m4.patch225 (text/plain, 17.4 KB)
Index: doc/m4.texinfo
===================================================================
RCS file: /sources/m4/m4/doc/m4.texinfo,v
retrieving revision 1.90
diff -u -p -r1.90 m4.texinfo
--- doc/m4.texinfo	9 Jan 2007 05:10:19 -0000	1.90
+++ doc/m4.texinfo	9 Jan 2007 14:15:10 -0000
@@ -1266,9 +1266,9 @@ call is not triggered.  This solves the 
 specific provision.
 
 @comment FIXME - The feature of blind macros is incompatible with
-@comment @acronym{POSIX} and @comment traditional implementations.
-@comment Should we  suppress it with the @comment @option{--traditional}
-@comment or @option{-G} command line option?
+@comment @acronym{POSIX} and traditional implementations.  Should we
+@comment suppress it with the @option{--traditional} or @option{-G}
+@comment command line option?
 
 @example
 $ @kbd{m4}
@@ -6059,6 +6059,17 @@ of any length.
 The macro @code{mpeval} is recognized only with parameters.
 @end deffn
 
+For the most part, using @code{mpeval} is similar to using @code{eval}:
+
+@comment options: -m mpeval
+@example
+$ @kbd{m4 -m mpeval}
+mpeval(`(1 << 70) + 2 ** 68 * 3', `16')
+@result{}700000000000000000
+`0r24:'mpeval(`0r36:zYx', `24', `5')
+@result{}0r24:038m9
+@end example
+
 The ratio operator, @samp{\}, is provided with the same precedence as
 division, and rationally divides two numbers and canonicalizes the
 result, whereas the division operator @samp{/} always returns the
@@ -6077,8 +6088,22 @@ value of the argument that ended evaluat
 even in @acronym{POSIX} mode, since @code{mpeval} does not have to
 conform to the @acronym{POSIX} rules for @code{eval}.
 
-@comment fixme - need some examples, but conditional on whether modules
-@comment and mpeval are both supported
+@comment options: -m mpeval
+@example
+$ @kbd{m4 -m mpeval}
+mpeval(`2 / 4')
+@result{}0
+mpeval(`2 \ 4')
+@result{}1\2
+mpeval(`2 || 3')
+@result{}2
+mpeval(`1 && 3')
+@result{}3
+mpeval(`-1 >> 1')
+@result{}-1
+mpeval(`-1 >>> 1')
+@result{}-1
+@end example
 
 @node Shell commands
 @chapter Macros for running shell commands
Index: m4/m4module.h
===================================================================
RCS file: /sources/m4/m4/m4/m4module.h,v
retrieving revision 1.103
diff -u -p -r1.103 m4module.h
--- m4/m4module.h	6 Jan 2007 19:56:53 -0000	1.103
+++ m4/m4module.h	9 Jan 2007 14:15:10 -0000
@@ -142,7 +142,6 @@ extern void		m4_delete	(m4 *);
 	M4FIELD(m4_obstack,	   trace_messages, trace_messages)	\
 	M4FIELD(int,		   exit_status,	   exit_status)		\
 	M4FIELD(int,	current_diversion,	   current_diversion)	\
-	M4FIELD(bool,	no_gnu_extensions_opt,	   no_gnu_extensions)	\
 	M4FIELD(size_t,	nesting_limit_opt,	   nesting_limit)	\
 	M4FIELD(int,	debug_level_opt,	   debug_level)		\
 	M4FIELD(size_t,	max_debug_arg_length_opt,  max_debug_arg_length)\
Index: m4/m4private.h
===================================================================
RCS file: /sources/m4/m4/m4/m4private.h,v
retrieving revision 1.75
diff -u -p -r1.75 m4private.h
--- m4/m4private.h	6 Jan 2007 19:56:54 -0000	1.75
+++ m4/m4private.h	9 Jan 2007 14:15:10 -0000
@@ -64,7 +64,6 @@ struct m4 {
   int		current_diversion;	/* Current output diversion.  */
 
   /* Option flags  (set in src/main.c).  */
-  bool		no_gnu_extensions;		/* -G */
   size_t	nesting_limit;			/* -L */
   int		debug_level;			/* -d */
   size_t	max_debug_arg_length;		/* -l */
@@ -80,7 +79,7 @@ struct m4 {
 #define M4_OPT_DISCARD_COMMENTS_BIT	(1 << 2) /* -c */
 #define M4_OPT_INTERACTIVE_BIT		(1 << 3) /* -e */
 #define M4_OPT_SYNCOUTPUT_BIT		(1 << 4) /* -s */
-#define M4_OPT_POSIXLY_CORRECT_BIT	(1 << 5) /* POSIXLY_CORRECT */
+#define M4_OPT_POSIXLY_CORRECT_BIT	(1 << 5) /* -G/POSIXLY_CORRECT */
 #define M4_OPT_FATAL_WARN_BIT		(1 << 6) /* -E */
 #define M4_OPT_SAFER_BIT		(1 << 7) /* --safer */
 
@@ -105,8 +104,6 @@ struct m4 {
 #  define m4_set_exit_status(C, V)		((C)->exit_status = (V))
 #  define m4_get_current_diversion(C)		((C)->current_diversion)
 #  define m4_set_current_diversion(C, V)	((C)->current_diversion = (V))
-#  define m4_get_no_gnu_extensions_opt(C)	((C)->no_gnu_extensions)
-#  define m4_set_no_gnu_extensions_opt(C, V)	((C)->no_gnu_extensions = (V))
 #  define m4_get_nesting_limit_opt(C)		((C)->nesting_limit)
 #  define m4_set_nesting_limit_opt(C, V)	((C)->nesting_limit = (V))
 #  define m4_get_debug_level_opt(C)		((C)->debug_level)
Index: m4/path.c
===================================================================
RCS file: /sources/m4/m4/m4/path.c,v
retrieving revision 1.23
diff -u -p -r1.23 path.c
--- m4/path.c	9 Oct 2006 21:06:33 -0000	1.23
+++ m4/path.c	9 Jan 2007 14:15:10 -0000
@@ -1,6 +1,6 @@
 /* GNU m4 -- A simple macro processor
 
-   Copyright (C) 1989, 1990, 1991, 1992, 1993, 1998, 2004, 2006
+   Copyright (C) 1989, 1990, 1991, 1992, 1993, 1998, 2004, 2006, 2007
    Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
@@ -102,7 +102,7 @@ m4_include_env_init (m4 *context)
 {
   char *m4path;
 
-  if (m4_get_no_gnu_extensions_opt (context))
+  if (m4_get_posixly_correct_opt (context))
     return;
 
   m4path = getenv ("M4PATH");
@@ -115,7 +115,7 @@ m4_include_env_init (m4 *context)
 void
 m4_add_include_directory (m4 *context, const char *dir, bool prepend)
 {
-  if (m4_get_no_gnu_extensions_opt (context))
+  if (m4_get_posixly_correct_opt (context))
     return;
 
   search_path_add (m4__get_search_path (context), dir, prepend);
@@ -153,7 +153,7 @@ m4_path_search (m4 *context, const char 
 
   /* If file is absolute, or if we are not searching a path, a single
      lookup will do the trick.  */
-  if (IS_ABSOLUTE_FILE_NAME (file) || m4_get_no_gnu_extensions_opt (context))
+  if (IS_ABSOLUTE_FILE_NAME (file) || m4_get_posixly_correct_opt (context))
     {
       fp = fopen (file, "r");
       if (fp != NULL)
Index: modules/m4.c
===================================================================
RCS file: /sources/m4/m4/modules/m4.c,v
retrieving revision 1.100
diff -u -p -r1.100 m4.c
--- modules/m4.c	6 Jan 2007 19:56:54 -0000	1.100
+++ modules/m4.c	9 Jan 2007 14:15:10 -0000
@@ -873,7 +873,7 @@ M4BUILTIN_HANDLER (m4exit)
 M4BUILTIN_HANDLER (m4wrap)
 {
   assert (obstack_object_size (obs) == 0);
-  if (m4_get_no_gnu_extensions_opt (context))
+  if (m4_get_posixly_correct_opt (context))
     m4_shipout_string (context, obs, M4ARG (1), 0, false);
   else
     m4_dump_args (context, obs, argc, argv, " ", false);
Index: src/freeze.c
===================================================================
RCS file: /sources/m4/m4/src/freeze.c,v
retrieving revision 1.57
diff -u -p -r1.57 freeze.c
--- src/freeze.c	23 Dec 2006 00:02:21 -0000	1.57
+++ src/freeze.c	9 Jan 2007 14:15:10 -0000
@@ -1,5 +1,5 @@
 /* GNU m4 -- A simple macro processor
-   Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 2004, 2005, 2006
+   Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 2004, 2005, 2006, 2007
    Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
@@ -462,7 +462,7 @@ reload_frozen_state (m4 *context, const 
     case 1:
       {
 	m4__module_open (context, "m4", NULL);
-	if (m4_get_no_gnu_extensions_opt (context))
+	if (m4_get_posixly_correct_opt (context))
 	  m4__module_open (context, "traditional", NULL);
 	else
 	  m4__module_open (context, "gnu", NULL);
Index: src/main.c
===================================================================
RCS file: /sources/m4/m4/src/main.c,v
retrieving revision 1.106
diff -u -p -r1.106 main.c
--- src/main.c	6 Jan 2007 19:56:54 -0000	1.106
+++ src/main.c	9 Jan 2007 14:15:10 -0000
@@ -364,7 +364,6 @@ main (int argc, char *const *argv, char 
 
   if (getenv ("POSIXLY_CORRECT"))
     {
-      m4_set_no_gnu_extensions_opt (context, true);
       m4_set_posixly_correct_opt (context, true);
       m4_set_suppress_warnings_opt (context, true);
     }
@@ -469,7 +468,6 @@ main (int argc, char *const *argv, char 
 	break;
 
       case 'G':
-	m4_set_no_gnu_extensions_opt (context, true);
 	m4_set_posixly_correct_opt (context, true);
 	break;
 
@@ -546,7 +544,6 @@ main (int argc, char *const *argv, char 
 	break;
 
       case 'g':
-	m4_set_no_gnu_extensions_opt (context, false);
 	m4_set_posixly_correct_opt (context, false);
 	break;
 
@@ -622,7 +619,7 @@ main (int argc, char *const *argv, char 
   else
     {
       m4_module_load (context, "m4", 0);
-      if (m4_get_no_gnu_extensions_opt (context))
+      if (m4_get_posixly_correct_opt (context))
 	m4_module_load (context, "traditional", 0);
       else
 	m4_module_load (context, "gnu", 0);
Index: tests/builtins.at
===================================================================
RCS file: /sources/m4/m4/tests/builtins.at,v
retrieving revision 1.35
diff -u -p -r1.35 builtins.at
--- tests/builtins.at	16 Nov 2006 14:42:38 -0000	1.35
+++ tests/builtins.at	9 Jan 2007 14:15:10 -0000
@@ -1,5 +1,5 @@
 # Hand crafted tests for GNU M4.                               -*- Autotest -*-
-# Copyright (C) 2001, 2006 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2006, 2007 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -320,140 +320,6 @@ AT_CLEANUP
 
 
 
-## --- ##
-## gmp ##
-## --- ##
-
-AT_SETUP([gmp])
-AT_CHECK_DYNAMIC_MODULE
-
-# cannot perform test without --with-gmp
-AT_CHECK([test "$USE_GMP" = yes || exit 77])
-
-AT_DATA([[in]],
-[[divert(-1)
-# forloop(i, from, to, stmt)
-
-define(`forloop', `pushdef(`$1', `$2')_forloop(`$1', `$2', `$3', `$4')popdef(`$1')')
-define(`_forloop',
-       `$4`'ifelse($1, `$3', ,
-			 `define(`$1', incr($1))_forloop(`$1', `$2', `$3', `$4')')')
-divert
-forloop(`x', 1, 100, `2**x = mpeval(2**x)
-')
-]])
-
-AT_DATA([[expout]],
-[[
-2**1 = 2
-2**2 = 4
-2**3 = 8
-2**4 = 16
-2**5 = 32
-2**6 = 64
-2**7 = 128
-2**8 = 256
-2**9 = 512
-2**10 = 1024
-2**11 = 2048
-2**12 = 4096
-2**13 = 8192
-2**14 = 16384
-2**15 = 32768
-2**16 = 65536
-2**17 = 131072
-2**18 = 262144
-2**19 = 524288
-2**20 = 1048576
-2**21 = 2097152
-2**22 = 4194304
-2**23 = 8388608
-2**24 = 16777216
-2**25 = 33554432
-2**26 = 67108864
-2**27 = 134217728
-2**28 = 268435456
-2**29 = 536870912
-2**30 = 1073741824
-2**31 = 2147483648
-2**32 = 4294967296
-2**33 = 8589934592
-2**34 = 17179869184
-2**35 = 34359738368
-2**36 = 68719476736
-2**37 = 137438953472
-2**38 = 274877906944
-2**39 = 549755813888
-2**40 = 1099511627776
-2**41 = 2199023255552
-2**42 = 4398046511104
-2**43 = 8796093022208
-2**44 = 17592186044416
-2**45 = 35184372088832
-2**46 = 70368744177664
-2**47 = 140737488355328
-2**48 = 281474976710656
-2**49 = 562949953421312
-2**50 = 1125899906842624
-2**51 = 2251799813685248
-2**52 = 4503599627370496
-2**53 = 9007199254740992
-2**54 = 18014398509481984
-2**55 = 36028797018963968
-2**56 = 72057594037927936
-2**57 = 144115188075855872
-2**58 = 288230376151711744
-2**59 = 576460752303423488
-2**60 = 1152921504606846976
-2**61 = 2305843009213693952
-2**62 = 4611686018427387904
-2**63 = 9223372036854775808
-2**64 = 18446744073709551616
-2**65 = 36893488147419103232
-2**66 = 73786976294838206464
-2**67 = 147573952589676412928
-2**68 = 295147905179352825856
-2**69 = 590295810358705651712
-2**70 = 1180591620717411303424
-2**71 = 2361183241434822606848
-2**72 = 4722366482869645213696
-2**73 = 9444732965739290427392
-2**74 = 18889465931478580854784
-2**75 = 37778931862957161709568
-2**76 = 75557863725914323419136
-2**77 = 151115727451828646838272
-2**78 = 302231454903657293676544
-2**79 = 604462909807314587353088
-2**80 = 1208925819614629174706176
-2**81 = 2417851639229258349412352
-2**82 = 4835703278458516698824704
-2**83 = 9671406556917033397649408
-2**84 = 19342813113834066795298816
-2**85 = 38685626227668133590597632
-2**86 = 77371252455336267181195264
-2**87 = 154742504910672534362390528
-2**88 = 309485009821345068724781056
-2**89 = 618970019642690137449562112
-2**90 = 1237940039285380274899124224
-2**91 = 2475880078570760549798248448
-2**92 = 4951760157141521099596496896
-2**93 = 9903520314283042199192993792
-2**94 = 19807040628566084398385987584
-2**95 = 39614081257132168796771975168
-2**96 = 79228162514264337593543950336
-2**97 = 158456325028528675187087900672
-2**98 = 316912650057057350374175801344
-2**99 = 633825300114114700748351602688
-2**100 = 1267650600228229401496703205376
-
-]])
-
-AT_CHECK_M4([-m mpeval in], 0, expout)
-
-AT_CLEANUP
-
-
-
 ## ------- ##
 ## include ##
 ## ------- ##
@@ -630,6 +496,138 @@ AT_CHECK([cat stdout], [0], [expout])
 AT_CLEANUP
 
 
+## ------ ##
+## mpeval ##
+## ------ ##
+
+AT_SETUP([mpeval])
+AT_CHECK_DYNAMIC_MODULE
+AT_CHECK_GMP
+
+AT_DATA([[in]],
+[[divert(-1)
+# forloop(i, from, to, stmt)
+
+define(`forloop', `pushdef(`$1', `$2')_forloop(`$1', `$2', `$3', `$4')popdef(`$1')')
+define(`_forloop',
+       `$4`'ifelse($1, `$3', ,
+			 `define(`$1', incr($1))_forloop(`$1', `$2', `$3', `$4')')')
+divert
+forloop(`x', 1, 100, `2**x = mpeval(2**x)
+')
+]])
+
+AT_DATA([[expout]],
+[[
+2**1 = 2
+2**2 = 4
+2**3 = 8
+2**4 = 16
+2**5 = 32
+2**6 = 64
+2**7 = 128
+2**8 = 256
+2**9 = 512
+2**10 = 1024
+2**11 = 2048
+2**12 = 4096
+2**13 = 8192
+2**14 = 16384
+2**15 = 32768
+2**16 = 65536
+2**17 = 131072
+2**18 = 262144
+2**19 = 524288
+2**20 = 1048576
+2**21 = 2097152
+2**22 = 4194304
+2**23 = 8388608
+2**24 = 16777216
+2**25 = 33554432
+2**26 = 67108864
+2**27 = 134217728
+2**28 = 268435456
+2**29 = 536870912
+2**30 = 1073741824
+2**31 = 2147483648
+2**32 = 4294967296
+2**33 = 8589934592
+2**34 = 17179869184
+2**35 = 34359738368
+2**36 = 68719476736
+2**37 = 137438953472
+2**38 = 274877906944
+2**39 = 549755813888
+2**40 = 1099511627776
+2**41 = 2199023255552
+2**42 = 4398046511104
+2**43 = 8796093022208
+2**44 = 17592186044416
+2**45 = 35184372088832
+2**46 = 70368744177664
+2**47 = 140737488355328
+2**48 = 281474976710656
+2**49 = 562949953421312
+2**50 = 1125899906842624
+2**51 = 2251799813685248
+2**52 = 4503599627370496
+2**53 = 9007199254740992
+2**54 = 18014398509481984
+2**55 = 36028797018963968
+2**56 = 72057594037927936
+2**57 = 144115188075855872
+2**58 = 288230376151711744
+2**59 = 576460752303423488
+2**60 = 1152921504606846976
+2**61 = 2305843009213693952
+2**62 = 4611686018427387904
+2**63 = 9223372036854775808
+2**64 = 18446744073709551616
+2**65 = 36893488147419103232
+2**66 = 73786976294838206464
+2**67 = 147573952589676412928
+2**68 = 295147905179352825856
+2**69 = 590295810358705651712
+2**70 = 1180591620717411303424
+2**71 = 2361183241434822606848
+2**72 = 4722366482869645213696
+2**73 = 9444732965739290427392
+2**74 = 18889465931478580854784
+2**75 = 37778931862957161709568
+2**76 = 75557863725914323419136
+2**77 = 151115727451828646838272
+2**78 = 302231454903657293676544
+2**79 = 604462909807314587353088
+2**80 = 1208925819614629174706176
+2**81 = 2417851639229258349412352
+2**82 = 4835703278458516698824704
+2**83 = 9671406556917033397649408
+2**84 = 19342813113834066795298816
+2**85 = 38685626227668133590597632
+2**86 = 77371252455336267181195264
+2**87 = 154742504910672534362390528
+2**88 = 309485009821345068724781056
+2**89 = 618970019642690137449562112
+2**90 = 1237940039285380274899124224
+2**91 = 2475880078570760549798248448
+2**92 = 4951760157141521099596496896
+2**93 = 9903520314283042199192993792
+2**94 = 19807040628566084398385987584
+2**95 = 39614081257132168796771975168
+2**96 = 79228162514264337593543950336
+2**97 = 158456325028528675187087900672
+2**98 = 316912650057057350374175801344
+2**99 = 633825300114114700748351602688
+2**100 = 1267650600228229401496703205376
+
+]])
+
+AT_CHECK_M4([-m mpeval in], 0, expout)
+
+AT_CLEANUP
+
+
+
 ## ----------- ##
 ## multiquotes ##
 ## ----------- ##
Index: tests/generate.awk
===================================================================
RCS file: /sources/m4/m4/tests/generate.awk,v
retrieving revision 1.24
diff -u -p -r1.24 generate.awk
--- tests/generate.awk	8 Nov 2006 19:06:00 -0000	1.24
+++ tests/generate.awk	9 Jan 2007 14:15:10 -0000
@@ -1,7 +1,7 @@
 # Extract all examples from the manual source.            -*- AWK -*-
 
 # This file is part of GNU M4
-# Copyright (C) 1992, 2000, 2001, 2006 Free Software Foundation, Inc.
+# Copyright (C) 1992, 2000, 2001, 2006, 2007 Free Software Foundation, Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -172,6 +172,8 @@ function new_test(input, status, output,
 
   if (options ~ /-m/)
     printf ("AT_CHECK_DYNAMIC_MODULE\n");
+  if (options ~ /-m mpeval/)
+    printf ("AT_CHECK_GMP\n");
   if (xfail == 1)
     printf ("AT_XFAIL_IF([:])\n");
 
Index: tests/testsuite.at
===================================================================
RCS file: /sources/m4/m4/tests/testsuite.at,v
retrieving revision 1.26
diff -u -p -r1.26 testsuite.at
--- tests/testsuite.at	6 Oct 2006 18:24:32 -0000	1.26
+++ tests/testsuite.at	9 Jan 2007 14:15:10 -0000
@@ -1,7 +1,7 @@
 # Process with autom4te to create an -*- Autotest -*- test suite.
 
 # Test suite for GNU M4.
-# Copyright (C) 2001, 2006 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2006, 2007 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -117,6 +117,17 @@ AT_CHECK([if test "x$DYNAMIC_MODULES" = 
   exit 77
 fi])])
 
+# AT_CHECK_GMP
+# -----------------------
+# Add keyword `gmp' to the test, and skip the test if the use of GMP
+# was disabled at configure time.
+m4_define([AT_CHECK_GMP],
+[AT_KEYWORDS([gmp])
+AT_CHECK([if test "x$USE_GMP" = xno ; then
+  echo libgmp support not detected, skipping this test.
+  exit 77
+fi])])
+
 ## ----------- ##
 ## The suite.  ##
 ## ----------- ##
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.