Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 216183
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 11, 20262026-05-11T18:32:27+00:00 2026-05-11T18:32:27+00:00

Here’s the deal: I’m trying, as a learning experience, to convert a C program

  • 0

Here’s the deal: I’m trying, as a learning experience, to convert a C program to C++. This program takes a text file and applies modifications to it according to user-inputted rules. Specifically, it applies sounds changes to a set of words, using rules formatted like “s1/s2/env”. s1 represents the characters to be changed, s2 represents what to change it into, and env is the context in which the change should be applied.

I’m sorry that I don’t describe this in more depth, but the question would be too long, and the author’s site already explains it.

The function I’m having trouble is TryRule. I understand that it’s supposed to see if a given rule applies to a given string, but I’m having trouble understanding exactly how it does it. The poor explanation of the parameters confuses me: for example, I don’t understand why the strings “s1” and “s2” have to be passed back, or what does “i” represent.

This is the code:

/*
**  TryRule
**
**  See if a rule s1->s2/env applies at position i in the given word.
**
**  If it does, we pass back the index where s1 was found in the
**  word, as well as s1 and s2, and return TRUE.
**
**  Otherwise, we return FALSE, and pass garbage in the output variables.
*/
int TryRule( char *word, int i, char *Rule, int *n, char **s1, char **s2, char *varRep )
    {
        int j, m, cont = 0;
        int catLoc;
        char *env;
        int  optional = FALSE;
        *varRep = '\0';

        if (!Divide( Rule, s1, s2, &env ) || !strchr( env, '_' ))
            return(FALSE);

        for (j = 0, cont = TRUE; cont && j < strlen(env); j++)
        {
            switch( env[j] )
            {
                case '(':
                    optional = TRUE;
                    break;

                case ')':
                    optional = FALSE;
                    break;

                case '#':
                    cont = j ? (i == strlen(word)) : (i == 0); 
                    break;

                case '_':
                    cont = !strncmp( &word[i], *s1, strlen(*s1) );
                    if (cont)
                    {
                        *n = i;
                        i += strlen(*s1);
                    }
                    else
                    {
                        cont = TryCat( *s1, &word[i], &m, &catLoc );
                        if (cont && m)
                        {
                            int c;
                            *n = i;
                            i += m;

                            for (c = 0; c < nCat; c++)
                                if ((*s2)[0] == Cat[c][0] && catLoc < strlen(Cat[c]))
                                    *varRep = Cat[c][catLoc];
                        }
                        else if (cont)
                            cont = FALSE;
                    }
                    break;

                default:
                    cont = TryCat( &env[j], &word[i], &m, &catLoc );
                    if (cont && !m)
                    {
                        /* no category applied */
                        cont = i < strlen(word) && word[i] == env[j];
                        m = 1;
                    }
                    if (cont)
                        i += m;
                    if (!cont && optional)
                        cont = TRUE;
            }
        }
        if (cont && printRules)
            printf( "   %s->%s /%s applies to %s at %i\n", 
            *s1, *s2, env, word, *n );

    return(cont);
}
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-11T18:32:27+00:00Added an answer on May 11, 2026 at 6:32 pm

    This code is… tough to read. I looked at the original file, and it could really use some better variable names. I especially love this part from one of the function comments:

    /*
    ** (Stuff I removed)
    **
    ** Warning: For now, we don't have a way to handle digraphs. 
    **
    ** We also return TRUE if (<- It really just stops here!)
    */
    

    I can see the challenge. I agree with wmeyer about the variables. I think I understand things, so I’m going to attempt to translate the function into pseudo code.

    Word: The string we are looking at
    i: The index in the string we’re looking at
    Rule: The text of the rule (i.e. “v/b/_”)
    n: A variable to return the index into the string we found the match for the _, I think
    s1: Returns the first part of the rule, decoded out of Rule
    s2: Returns the second part of the rule, decoded out of Rule
    varRep: Returns the character matched in the category, if a category matched, I think

    int TryRule( char *word, int i, char *Rule,
                    int *n, char **s1, char **s2, char *varRep ) {
            Prepare a bunch of variables we''ll use later
            Mark that we''re not working on an optional term
            Set varRep''s first char to null, so it''s an empty string
    
            if (We can parse the rule into it''s parts
                  OR there is no _ in the environment (which is required))
                return FALSE // Error, we can't run, the rule is screwy
    
            for (each character, j, in env (the third part of the rule)) {
                if (cont is TRUE) {
                    switch (the character we''re looking at, j) {
                        if the character is opening paren:
                            set optional to TRUE, marking it''s an optional character
                        if the character is closing paren:
                            set optional to FALSE, since we''re done with optional stuff
                        if the character is a hash mark (#):
                            // This is rather complicated looking, but it's not bad
                            // This uses a ? b : c, which means IF a THEN b ELSE c
                            // Remember i is the position in the word we are looking at
                            // Hash marks match the start or end of a word
                            // J is the character in the word
    
                            if (j >= 0) {
                                // We're not working on the first character in the rule
                                // so the # mark we found is to find the end of a word
    
                                if (i == the length of the word we''re looking at) {
                                    // We've found the end of the word, so the rule matches
    
                                    continue = true;   // Keep going
                                } else {
                                    // We're not at the end of a word, but we found a hash
                                    // Rule doesn't match, so break out of the main loop by setting
                                    //     continue to false
    
                                    continue = false;
                                }
                            } else {
                                // OK, the hash mark is the first part of env,
                                // so it signifies the start of a word
    
                                continue = (i == 0);   // Continue holds if we
                                                       // are matching the first
                                                       // character in *word or not
                            }
                        if the character is an _ (the match character):
                            // This gets complicated
    
                            continue = if word starting at character i ISN''T s1, the search string;
    
                            if (continue == TRUE) {
                                // There was no match, so we'll go look at the next word
                                n = the index of the word start that didn''t match   // Not sure why
                                i = i (start index to look) + length of s1 (word we just matched)
                                // This means i now holds the index of the start of the next word
                            } else {
                                // TryCat sees if the character we're trying to match is a category
    
                                continue = s1 is a category in the program
                                              && the category contains the character at word[i]
    
                                // If continue holds false, s1 was a category and we found no match
                                // If continue holds true, s1 either wasn't a category (so m = 0)
                                //     or s1 WAS a category, m contains 1, and catLoc holds which
                                //     character in the category definition was matched
    
                                if (we found a match of some sort
                                       && s1 was a category (indicated by m == 1)) {
                                    n = index of the character in the word we found a match
                                    i = the index of the next character (m is always 1, so this is ugly)
    
                                    for (each category defined) {
                                        if (first character of s2
                                               == the category''s name
                                            && where in the category definition we matched
                                                  is less than the length of the category we''re on) {
                                               varRep = the character matched in the category
                                            }
                                    }
    
                                    // Now the above seems EXACTLY like the TryCat function. You'd
                                    // think varRep would always hold the same value as catLoc. I
                                    // believe this loop is so that later rules also get applied?
                                } else {
                                    continue = FALSE; // Because we didn't match a letter or category
                                }
                            }
                        Any other character:
                            continue = the character we''re looking at is a category in the program
                                          && the category contains the character at word[i]
    
                            if (there was a match AND it wasn''t a category (m == 0, just a letter)) {
                                m = 1;
                                continue if and only if there are characters left in the word
                                     (i < strlen()) && the current character is at word[i]
                                     (we matched a literal character, instead of a category)
                            }
    
                            if (continue)
                                i = i + m // Remember, M is always 1 or 0
                                          // So this is basically IF continue THEN i++ END IF
                            if ((continue == FALSE) && (optional == TRUE))
                                // We didn't find a match, but we're working on an optional part
                                // So continue anyway
                                continue = TRUE;
                    end switch
                 end if continue == true
            }
        }
    
        if (continue && printRules)
            print out a little debug statement showing what we matched
    
        return continue;   // At this point, if continue is false we can't keep matching
    }
    

    I hope this helps. You may need to read it a few times. It took me over 45 minutes to write this, almost entirely because of trying to decipher exactly what’s going on in some of the cases around TryCat. Add in about 5 minutes for constantly trying to hit the Tab key and getting my cursor send to the next field (stupid HTML text box).

    Sorry this is so big, you’ll probably have to do a bunch of horizontal scrolling.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Ask A Question

Stats

  • Questions 189k
  • Answers 189k
  • Best Answers 0
  • User 1
  • Popular
  • Answers
  • Editorial Team

    How to approach applying for a job at a company ...

    • 7 Answers
  • Editorial Team

    What is a programmer’s life like?

    • 5 Answers
  • Editorial Team

    How to handle personal stress caused by utterly incompetent and ...

    • 5 Answers
  • Editorial Team
    Editorial Team added an answer Found the issue, putting here in case others need the… May 12, 2026 at 5:43 pm
  • Editorial Team
    Editorial Team added an answer You have to be careful with performance tests because it's… May 12, 2026 at 5:43 pm
  • Editorial Team
    Editorial Team added an answer You can use something like this new_arr = array.inject([]) {… May 12, 2026 at 5:43 pm

Related Questions

I ran into a problem. Wrote the following code snippet: teksti = teksti.Trim() teksti
Is it possible to replace javascript w/ HTML if JavaScript is not enabled on
I'm trying to decode HTML entries from here NYTimes.com and I cannot figure out
Here's a basic regex technique that I've never managed to remember. Let's say I'm
Here's a problem I ran into recently. I have attributes strings of the form

Trending Tags

analytics british company computer developers django employee employer english facebook french google interview javascript language life php programmer programs salary

Top Members

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.