/* do not edit automatically generated by mc from mcComment. */ /* mcComment.mod provides a module to remember the comments. Copyright (C) 2015-2024 Free Software Foundation, Inc. Contributed by Gaius Mulley . 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 . */ #include "config.h" #include "system.h" #include # 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; bool 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 (bool 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" bool mcComment_isProcedureComment (mcComment_commentDesc cd); /* isBodyComment - returns TRUE if, cd, is a body comment. */ extern "C" bool mcComment_isBodyComment (mcComment_commentDesc cd); /* isAfterComment - returns TRUE if, cd, is an after comment. */ extern "C" bool 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 bool 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 bool seenProcedure (mcComment_commentDesc cd, nameKey_Name procName) { DynamicStrings_String s; void * a; unsigned int i; unsigned int h; bool res; a = nameKey_keyToCharStar (procName); s = RemoveNewlines (cd->content); s = DynamicStrings_Slice (DynamicStrings_Mark (s), 0, static_cast (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/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 (bool 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 (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 (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 (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 (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" bool 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" bool 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" bool 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_fini (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[]) { }