aboutsummaryrefslogtreecommitdiff
path: root/gcc/m2/mc-boot/GmcComment.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/m2/mc-boot/GmcComment.c')
-rw-r--r--gcc/m2/mc-boot/GmcComment.c468
1 files changed, 468 insertions, 0 deletions
diff --git a/gcc/m2/mc-boot/GmcComment.c b/gcc/m2/mc-boot/GmcComment.c
new file mode 100644
index 0000000..d9e65b1
--- /dev/null
+++ b/gcc/m2/mc-boot/GmcComment.c
@@ -0,0 +1,468 @@
+/* do not edit automatically generated by mc from mcComment. */
+/* mcComment.mod provides a module to remember the comments.
+
+Copyright (C) 2015-2022 Free Software Foundation, Inc.
+Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
+
+This file is part of GNU Modula-2.
+
+GNU Modula-2 is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+GNU Modula-2 is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Modula-2; see the file COPYING3. If not see
+<http://www.gnu.org/licenses/>. */
+
+#include "config.h"
+#include "system.h"
+# if !defined (PROC_D)
+# define PROC_D
+ typedef void (*PROC_t) (void);
+ typedef struct { PROC_t proc; } PROC;
+# endif
+
+# if !defined (TRUE)
+# define TRUE (1==1)
+# endif
+
+# if !defined (FALSE)
+# define FALSE (1==0)
+# endif
+
+# include "GStorage.h"
+# include "Gmcrts.h"
+#if defined(__cplusplus)
+# undef NULL
+# define NULL 0
+#endif
+#define _mcComment_H
+#define _mcComment_C
+
+# include "GDynamicStrings.h"
+# include "GStorage.h"
+# include "GnameKey.h"
+# include "GmcDebug.h"
+# include "GASCII.h"
+# include "Glibc.h"
+
+typedef struct mcComment__T1_r mcComment__T1;
+
+typedef enum {mcComment_unknown, mcComment_procedureHeading, mcComment_inBody, mcComment_afterStatement} mcComment_commentType;
+
+typedef mcComment__T1 *mcComment_commentDesc;
+
+struct mcComment__T1_r {
+ mcComment_commentType type;
+ DynamicStrings_String content;
+ nameKey_Name procName;
+ unsigned int used;
+ };
+
+
+/*
+ initComment - the start of a new comment has been seen by the lexical analyser.
+ A new comment block is created and all addText contents are placed
+ in this block. onlySpaces indicates whether we have only seen
+ spaces on this line.
+*/
+
+extern "C" mcComment_commentDesc mcComment_initComment (unsigned int onlySpaces);
+
+/*
+ addText - cs is a C string (null terminated) which contains comment text.
+ This is appended to the comment, cd.
+*/
+
+extern "C" void mcComment_addText (mcComment_commentDesc cd, void * cs);
+
+/*
+ getContent - returns the content of comment, cd.
+*/
+
+extern "C" DynamicStrings_String mcComment_getContent (mcComment_commentDesc cd);
+
+/*
+ getCommentCharStar - returns the C string content of comment, cd.
+*/
+
+extern "C" void * mcComment_getCommentCharStar (mcComment_commentDesc cd);
+
+/*
+ setProcedureComment - changes the type of comment, cd, to a
+ procedure heading comment,
+ providing it has the procname as the first word.
+*/
+
+extern "C" void mcComment_setProcedureComment (mcComment_commentDesc cd, nameKey_Name procname);
+
+/*
+ getProcedureComment - returns the current procedure comment if available.
+*/
+
+extern "C" DynamicStrings_String mcComment_getProcedureComment (mcComment_commentDesc cd);
+
+/*
+ getAfterStatementComment - returns the current statement after comment if available.
+*/
+
+extern "C" DynamicStrings_String mcComment_getAfterStatementComment (mcComment_commentDesc cd);
+
+/*
+ getInbodyStatementComment - returns the current statement after comment if available.
+*/
+
+extern "C" DynamicStrings_String mcComment_getInbodyStatementComment (mcComment_commentDesc cd);
+
+/*
+ isProcedureComment - returns TRUE if, cd, is a procedure comment.
+*/
+
+extern "C" unsigned int mcComment_isProcedureComment (mcComment_commentDesc cd);
+
+/*
+ isBodyComment - returns TRUE if, cd, is a body comment.
+*/
+
+extern "C" unsigned int mcComment_isBodyComment (mcComment_commentDesc cd);
+
+/*
+ isAfterComment - returns TRUE if, cd, is an after comment.
+*/
+
+extern "C" unsigned int mcComment_isAfterComment (mcComment_commentDesc cd);
+
+/*
+ Min - returns the lower of, a, and, b.
+*/
+
+static unsigned int Min (unsigned int a, unsigned int b);
+
+/*
+ RemoveNewlines -
+*/
+
+static DynamicStrings_String RemoveNewlines (DynamicStrings_String s);
+
+/*
+ seenProcedure - returns TRUE if the name, procName, appears as the first word
+ in the comment.
+*/
+
+static unsigned int seenProcedure (mcComment_commentDesc cd, nameKey_Name procName);
+
+/*
+ dumpComment -
+*/
+
+static void dumpComment (mcComment_commentDesc cd);
+
+
+/*
+ Min - returns the lower of, a, and, b.
+*/
+
+static unsigned int Min (unsigned int a, unsigned int b)
+{
+ if (a < b)
+ {
+ return a;
+ }
+ else
+ {
+ return b;
+ }
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ RemoveNewlines -
+*/
+
+static DynamicStrings_String RemoveNewlines (DynamicStrings_String s)
+{
+ while ((DynamicStrings_Length (s)) > 0)
+ {
+ if ((DynamicStrings_char (s, 0)) == ASCII_nl)
+ {
+ s = DynamicStrings_RemoveWhitePrefix (DynamicStrings_Slice (s, 1, 0));
+ }
+ else
+ {
+ return DynamicStrings_RemoveWhitePrefix (s);
+ }
+ }
+ return s;
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ seenProcedure - returns TRUE if the name, procName, appears as the first word
+ in the comment.
+*/
+
+static unsigned int seenProcedure (mcComment_commentDesc cd, nameKey_Name procName)
+{
+ DynamicStrings_String s;
+ void * a;
+ unsigned int i;
+ unsigned int h;
+ unsigned int res;
+
+ a = nameKey_keyToCharStar (procName);
+ s = RemoveNewlines (cd->content);
+ s = DynamicStrings_Slice (DynamicStrings_Mark (s), 0, static_cast<int> (Min (DynamicStrings_Length (s), nameKey_lengthKey (procName))));
+ res = DynamicStrings_EqualCharStar (s, a);
+ s = DynamicStrings_KillString (s);
+ return res;
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ dumpComment -
+*/
+
+static void dumpComment (mcComment_commentDesc cd)
+{
+ libc_printf ((const char *) "comment : ", 10);
+ switch (cd->type)
+ {
+ case mcComment_unknown:
+ libc_printf ((const char *) "unknown", 7);
+ break;
+
+ case mcComment_procedureHeading:
+ libc_printf ((const char *) "procedureheading", 16);
+ break;
+
+ case mcComment_inBody:
+ libc_printf ((const char *) "inbody", 6);
+ break;
+
+ case mcComment_afterStatement:
+ libc_printf ((const char *) "afterstatement", 14);
+ break;
+
+
+ default:
+ CaseException ("../../gcc-git-devel-modula2/gcc/m2/mc/mcComment.def", 20, 1);
+ __builtin_unreachable ();
+ }
+ if (cd->used)
+ {
+ libc_printf ((const char *) " used", 5);
+ }
+ else
+ {
+ libc_printf ((const char *) " unused", 7);
+ }
+ libc_printf ((const char *) " contents = %s\\n", 16, DynamicStrings_string (cd->content));
+}
+
+
+/*
+ initComment - the start of a new comment has been seen by the lexical analyser.
+ A new comment block is created and all addText contents are placed
+ in this block. onlySpaces indicates whether we have only seen
+ spaces on this line.
+*/
+
+extern "C" mcComment_commentDesc mcComment_initComment (unsigned int onlySpaces)
+{
+ mcComment_commentDesc cd;
+
+ Storage_ALLOCATE ((void **) &cd, sizeof (mcComment__T1));
+ mcDebug_assert (cd != NULL);
+ if (onlySpaces)
+ {
+ cd->type = mcComment_inBody;
+ }
+ else
+ {
+ cd->type = mcComment_afterStatement;
+ }
+ cd->content = DynamicStrings_InitString ((const char *) "", 0);
+ cd->procName = nameKey_NulName;
+ cd->used = FALSE;
+ return cd;
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ addText - cs is a C string (null terminated) which contains comment text.
+ This is appended to the comment, cd.
+*/
+
+extern "C" void mcComment_addText (mcComment_commentDesc cd, void * cs)
+{
+ if (cd != NULL)
+ {
+ cd->content = DynamicStrings_ConCat (cd->content, DynamicStrings_InitStringCharStar (cs));
+ }
+}
+
+
+/*
+ getContent - returns the content of comment, cd.
+*/
+
+extern "C" DynamicStrings_String mcComment_getContent (mcComment_commentDesc cd)
+{
+ if (cd != NULL)
+ {
+ return cd->content;
+ }
+ return static_cast<DynamicStrings_String> (NULL);
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ getCommentCharStar - returns the C string content of comment, cd.
+*/
+
+extern "C" void * mcComment_getCommentCharStar (mcComment_commentDesc cd)
+{
+ DynamicStrings_String s;
+
+ s = mcComment_getContent (cd);
+ if (s == NULL)
+ {
+ return NULL;
+ }
+ else
+ {
+ return DynamicStrings_string (s);
+ }
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ setProcedureComment - changes the type of comment, cd, to a
+ procedure heading comment,
+ providing it has the procname as the first word.
+*/
+
+extern "C" void mcComment_setProcedureComment (mcComment_commentDesc cd, nameKey_Name procname)
+{
+ if (cd != NULL)
+ {
+ if (seenProcedure (cd, procname))
+ {
+ cd->type = mcComment_procedureHeading;
+ cd->procName = procname;
+ }
+ }
+}
+
+
+/*
+ getProcedureComment - returns the current procedure comment if available.
+*/
+
+extern "C" DynamicStrings_String mcComment_getProcedureComment (mcComment_commentDesc cd)
+{
+ if ((cd->type == mcComment_procedureHeading) && ! cd->used)
+ {
+ cd->used = TRUE;
+ return cd->content;
+ }
+ return static_cast<DynamicStrings_String> (NULL);
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ getAfterStatementComment - returns the current statement after comment if available.
+*/
+
+extern "C" DynamicStrings_String mcComment_getAfterStatementComment (mcComment_commentDesc cd)
+{
+ if ((cd->type == mcComment_afterStatement) && ! cd->used)
+ {
+ cd->used = TRUE;
+ return cd->content;
+ }
+ return static_cast<DynamicStrings_String> (NULL);
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ getInbodyStatementComment - returns the current statement after comment if available.
+*/
+
+extern "C" DynamicStrings_String mcComment_getInbodyStatementComment (mcComment_commentDesc cd)
+{
+ if ((cd->type == mcComment_inBody) && ! cd->used)
+ {
+ cd->used = TRUE;
+ return cd->content;
+ }
+ return static_cast<DynamicStrings_String> (NULL);
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ isProcedureComment - returns TRUE if, cd, is a procedure comment.
+*/
+
+extern "C" unsigned int mcComment_isProcedureComment (mcComment_commentDesc cd)
+{
+ return (cd != NULL) && (cd->type == mcComment_procedureHeading);
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ isBodyComment - returns TRUE if, cd, is a body comment.
+*/
+
+extern "C" unsigned int mcComment_isBodyComment (mcComment_commentDesc cd)
+{
+ return (cd != NULL) && (cd->type == mcComment_inBody);
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+
+/*
+ isAfterComment - returns TRUE if, cd, is an after comment.
+*/
+
+extern "C" unsigned int mcComment_isAfterComment (mcComment_commentDesc cd)
+{
+ return (cd != NULL) && (cd->type == mcComment_afterStatement);
+ /* static analysis guarentees a RETURN statement will be used before here. */
+ __builtin_unreachable ();
+}
+
+extern "C" void _M2_mcComment_init (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[])
+{
+}
+
+extern "C" void _M2_mcComment_finish (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[])
+{
+}