How to remove comments of *c* programming language using javascript and php with Regex?

Table of contents

Regex is a language where used to validate the syntax of particular match of characters and text using patterns.

JavaScript is a scripting language used as part of frontend functionality.

php is langauge used as backend server scripting language.

the code before formatting

    /*
     * C Program to Detect the Cycle in a Linked List 
     */

    #include <stdio.h>
    #include <stdlib.h>


    /* structure for node /    */
    struct node
    {
        int num;
        struct node *next;
    };

    void create(struct node **);
    void makecycle(struct node **);
    void release(struct node **);
    int detectcycle(struct node *);

    /*
     * main program */
     */

    int main()
    {

        struct node *p = NULL;
        int result;

        printf("Enter data into the list\n");

        create(&p);

        makecycle(&p); //comment it to avoid cycle creation

        printf("Identifying if a cycle exists.\n");

        result = detectcycle(p);

        if (result)

        {

            printf("Cycle detected in the linked list.\n");

        }

        else

        {

            printf("No cycle detected in the linked list.\n");

        }

        release (&p);

        return 0;
    }

    / Make cycles */
    void makecycle(struct node **p)

    {

        struct node *rear, *front;

        int n, count = 0, i;

        front = rear = *p;

        while (rear->next != NULL)

        {

            rear = rear->next;

            count++;

        }

        if (count)

        {

            n = rand() % count;

        }

        else

        {

            n = 1;

        }

        for (i = 0; i < n - 1; i++)

        {

            front = front->next;

        }

        rear->next = front;

        /*At this point a cycle is generated in the list*/

    }


    /* Detect cycle **
    int detectcycle(struct node *head)

    {

        int flag = 1, count = 1, i;

        struct node *p, *q;



        p = q = head;

        q = q->next;

        while (1)

        {

            q = q->next;

            if (flag)

            {

                p = p->next;

            }

            if (q == p)

            {

                /*Deleting the loop to deallocate the list*/

                q = q->next;

                while (q != p)

                {

                    count++;

                    q = q->next;

                }

                q = p = head;

                for (i = 0; i < count; i++)

                {

                    q = q->next;

                }

                while (p != q)

                {

                    p = p->next;

                    q = q->next;

                }

                q->next = NULL;

                return 1;

            }

            else if (q->next == NULL)

            {

                return 0;

            }

            flag = !flag;

        }

    }


    /* Creat the linked list 

    void create(struct node **head)

    {

        int c, ch;

        struct node *temp, *rear;

        do

        {

            printf("Enter number: ");

            scanf("%d", &c);

            temp = (struct node *)malloc(sizeof(struct node));

            temp->num = c;

            temp->next = NULL;

            if (*head == NULL)

            {

                *head = temp;

            }

            else

            {

                rear->next = temp;

            }

            rear = temp;

            printf("Do you wish to continue [1/0]: ");

            scanf("%d", &ch);

        } while (ch != 0);

        printf("\n");

    }


    // Free the memory spae of the list 

    void release(struct node **head)

    {

        struct node *temp = *head;

        temp = temp->next;

        while ((*head) != NULL)

        {

            free(temp);

            temp = *head;

            (*head) = (*head)->next;

        }

    }

php code

<?php
// proper comments
$singleComment = "/(?:^|\s)\/\/(.+?)$/sm";// remove proper single line comments
$multilineComments = "/\/\*[^\/]+\*\//sm" ; // remove porper multiline comments 

$patterns = array(
    $singleComment=>'',
    $multilineComments=>'',
);

// the code snippets where error has to be present
$no_end_slash = "/\/\*[\w\s]+\*{2}/s"; // remove comments ended with **
$text = "/\/\*(\s\w+)*/s"; // remove single line comment unended with * or /
$endRemover = "/\s\*{0,2}\//s"; // remove comment end statement with space **/
$multiComment = "/\/[^\/]+\*\//sm";

$errors = array(
    $no_end_slash,
    $text,
    $endRemover,
    $multiComment
);

// read the input/output file name in the present directory from user cmd line
$inputFileName = readLine("Enter a input file name:\t");
$outputFileName = readLine("Enter a output file name:\t");

$inputFileSize = filesize($inputFileName);
$fileContent = file_get_contents($inputFileName);
foreach ($patterns as $pattern => $replacement) {
    $fileContent = preg_replace($pattern, $replacement, $fileContent);
}

for ($i = 0; $i < count($errors); $i++) {
    preg_match_all($errors[$i], $fileContent, $matches);

    echo "Errors matching Pattern " . ($i + 1) . ":\n";
    // Iterate over the matches and echo them
    foreach ($matches[0] as $match) {
        echo $match . "\n";
    }
}

file_put_contents($outputFileName,$fileContent);
?>

javascript code

const fs = require('fs');
// install prompt package using node
// node install prompt-sync
const prompt = require('prompt-sync')();
// field to take input
var inputFileName = prompt("Enter input file name in the present directory:\t");
var oututFileName = prompt("Enter output file name with extension:\t");

// Find invalid comments
function findInvalidComments(code, regexes) {
    const invalidComments = [];
    regexes.forEach(regex => {
        const matches = code.match(regex) || [];
        matches.forEach(comment => {
            invalidComments.push(comment);
            code = code.replace(regex, '')
        });
    });
    return invalidComments;
}

function RemoveComments(code) {

    const singleComment = /(?:^|\s)\/\/(.+?)$/gsm // remove proper single line comments
    const multilineComments = /\/\*[^\/]+\*\//gsm// remove porper multiline comments

    // replacing comments with blank
    code = code.replace(singleComment, '')
    code = code.replace(multilineComments, '');
    return code
}

// read file with the content
fs.readFile(inputFileName, 'utf-8', (err, data) => {
    if (err) {
        throw err;
    }
    // clean the code
    const cleanedCode = RemoveComments(data);

    const multilineComments = /\/[^\/]+\*\//gsm // remove imporper multiline comments
    const no_end_slash = /\/\*[\w\s]+\*{2}/gsm // remove comments ended with **
    const text = /\/\*(\s\w+)*/gsm // remove single line comment unended with * or /
    const endRemover = /\s\*{0,2}\//gsm // remove comment end statement with space **/
    // invalid comment test
    const regexes = [multilineComments, no_end_slash, text, endRemover];
    const invalidComments = findInvalidComments(cleanedCode, regexes);

    // Report invalid comments
    if (invalidComments.length > 0) {
        console.log("Invalid comments found:");
        invalidComments.forEach(comment => {
            console.log(comment);
        });
    } else {
        console.log("No invalid comments found.");
    }

    // write the clean code to the file
    fs.writeFile(oututFileName, cleanedCode, 'utf8', err => {
        if (err) {
            console.error('Error writing to file:', err);
            return;
        }
        console.log('File updated successfully.');
    });

})

At the end of run of program you will see that the comments from the c code both valid and invalid are removed.



    #include <stdio.h>
    #include <stdlib.h>



    struct node
    {
        int num;
        struct node *next;
    };

    void create(struct node **);
    void makecycle(struct node **);
    void release(struct node **);
    int detectcycle(struct node *);




    int main()
    {

        struct node *p = NULL;
        int result;

        printf("Enter data into the list\n");

        create(&p);

        makecycle(&p);

        printf("Identifying if a cycle exists.\n");

        result = detectcycle(p);

        if (result)

        {

            printf("Cycle detected in the linked list.\n");

        }

        else

        {

            printf("No cycle detected in the linked list.\n");

        }

        release (&p);

        return 0;
    }


    void makecycle(struct node **p)

    {

        struct node *rear, *front;

        int n, count = 0, i;

        front = rear = *p;

        while (rear->next != NULL)

        {

            rear = rear->next;

            count++;

        }

        if (count)

        {

            n = rand() % count;

        }

        else

        {

            n = 1;

        }

        for (i = 0; i < n - 1; i++)

        {

            front = front->next;

        }

        rear->next = front;



    }



    int detectcycle(struct node *head)

    {

        int flag = 1, count = 1, i;

        struct node *p, *q;



        p = q = head;

        q = q->next;

        while (1)

        {

            q = q->next;

            if (flag)

            {

                p = p->next;

            }

            if (q == p)

            {



                q = q->next;

                while (q != p)

                {

                    count++;

                    q = q->next;

                }

                q = p = head;

                for (i = 0; i < count; i++)

                {

                    q = q->next;

                }

                while (p != q)

                {

                    p = p->next;

                    q = q->next;

                }

                q->next = NULL;

                return 1;

            }

            else if (q->next == NULL)

            {

                return 0;

            }

            flag = !flag;

        }

    }




    void create(struct node **head)

    {

        int c, ch;

        struct node *temp, *rear;

        do

        {

            printf("Enter number: ");

            scanf("%d", &c);

            temp = (struct node *)malloc(sizeof(struct node));

            temp->num = c;

            temp->next = NULL;

            if (*head == NULL)

            {

                *head = temp;

            }

            else

            {

                rear->next = temp;

            }

            rear = temp;

            printf("Do you wish to continue [1/0]: ");

            scanf("%d", &ch);

        } while (ch != 0);

        printf("\n");

    }




    void release(struct node **head)

    {

        struct node *temp = *head;

        temp = temp->next;

        while ((*head) != NULL)

        {

            free(temp);

            temp = *head;

            (*head) = (*head)->next;

        }

    }

Did you find this article valuable?

Support Master Software Development by becoming a sponsor. Any amount is appreciated!