• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 342
  • Last Modified:

Regex Converting C# to C

I have a small function to compress a string so it is easy to transmit.

Basically long sequences of similar characters are substituted so for example.

0000000 11111 00000000000 22222222222222222222

becomes (ignore spaces)

A7A B5B A11A C20C

The C# is:

     static string CompressMessage(string message)
     {
         return Regex.Replace(message, @"([0-7])\1{3,}", (Match m) => String.Format("{0}{1}{0}", (char)(m.Groups[1].Value[0] + 17), m.Value.Length));
     }

Question:

I there an equivalent C library OR how easy is it to write this in C (for an embedded system)



0
oddszone
Asked:
oddszone
  • 3
1 Solution
 
käµfm³d 👽Commented:
There is the Boost regex library, but I don't know if it can be loaded to an embedded system.

Here is my stab at a C version. It's probably sloppy, but it should give you a start, I hope!


Yes, my C-Fu is not strong  ; )
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char* compressMessage(char* message);

void main(void)
{
    char source[] = "0000000 11111 00000000000 22222222222222222222";
    char* result;
    
    printf("Source string: %s\n", source);
    
    result = compressMessage(source);
    
    printf("Compressed string: %s\n", result);
    
    free(result);
}

char* compressMessage(char* message)
{
    // There's probably a better way to create the buffer
    char* buffer = (char*)malloc(sizeof(char) * strlen(message));
    int curIdx = 0;
    int bufIdx = 0;
    
    while (message[curIdx] != '\0')                         // While not eos (would be better if length was a function parameter
    {
        char curChr;
        int curCnt = 1;
        
        curChr = message[curIdx++];
        
        while (message[curIdx++] == curChr) { curCnt++; }   // Loop over repeating characters
        
        curIdx--;                                           // Readjust indexer so we don't drop any characters from output
        
        if (curChr == ' ')                                  // Print spaces in output
        {
            int i;
            
            for (i = 0; i < curCnt; i++)
            {
                buffer[bufIdx++] = ' ';
            }
        }
        else                                                // Print encoded string to output
        {
            bufIdx = sprintf(&buffer[bufIdx], "%c%d%c", curChr + ('A' - '0'), curCnt, curChr + ('A' - '0'));
        }
    }
    
    buffer[bufIdx] = '\0';                                  // Terminate the output string
    
    return buffer;
}

Open in new window

0
 
käµfm³d 👽Commented:
Line 50 should read (plus-equals):
bufIdx += sprintf(&buffer[bufIdx], "%c%d%c", curChr + ('A' - '0'), curCnt, curChr + ('A' - '0'));

Open in new window

0
 
oddszoneAuthor Commented:
Thats fantastic. I just need to modify so it only substitutes when >3 chars in a row detected otherwise you add more characters to the output which defeats the object.
0
 
käµfm³d 👽Commented:
Ahhh, yes. I missed that little point, huh?  Glad you can work with it and glad to help  : )
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now