Link to home
Start Free TrialLog in
Avatar of oddszone
oddszoneFlag for Switzerland

asked on

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)



Avatar of kaufmed
kaufmed
Flag of United States of America image

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

ASKER CERTIFIED SOLUTION
Avatar of kaufmed
kaufmed
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of oddszone

ASKER

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.
Ahhh, yes. I missed that little point, huh?  Glad you can work with it and glad to help  : )