Strip control codes and extended characters from a string: Difference between revisions

Line 260:
#include <string.h>
 
 
#define MAXBUF 256 // limit string size
#define MAXBUF 256 /* limit */
#define STR_SZ 100 /* string size */
 
 
/* function prototypes */
int ascii (const unsigned char c);
 
char* strip(char* str, const size_t n);
int ascii_ext (const unsigned char c);
 
unsigned char* strip(unsigned char* str, const size_t n, int ext );
 
 
/* check character
return 1 for true
0 for false
*/
int ascii (const unsigned char c)
{
unsigned char min = 32;
unsigned char max = 126;
 
/* check character for compliance
return 1 == true 0 == false
*/
int ascii (const char c)
{
char min = ' ', max = '~';
if ( c>=min && c<=max ) return 1;
 
return 0;
}
 
 
/* check i extended character
return 1 for true
0 for false
*/
int ascii_ext (const unsigned char c)
{
unsigned char min_ext = 128;
unsigned char max_ext = 255;
 
if ( c>=min_ext && c<=max_ext )
return 1;
 
return 0;
}
 
 
/* fill buffer onlyomly with valid characters
then rewrite string from buffer
limit to n < MAX chars
*/
 
unsigned char* strip( unsigned char* str, const size_t n, int ext)
{
 
char buffer[MAXBUF] = {'\0'};
unsigned char buffer[MAXBUF] = {'\0'};
 
size_t i = 0; // source index
size_t j = 0; // dest index
 
size_t max = (n<MAXBUF)? n : MAXBUF -1; // limit size
 
while (i < max )
{
if ( ascii(ext && ascii_ext(str[i]) ) buffer[j++]|| = (ascii(str[i];) ) ) // assigncheck
{
i++;
buffer[j++] = str[i]; // assign
}
i++;
}
 
memset(str, '\0', nmax); // wipe original string
 
i = 0; // reset count
 
while( i < j)
{
Line 305 ⟶ 337:
i++;
}
 
str[j] = '\0'; // terminate properly
 
return str; //
 
}
 
/* try it out */
int main( int argc, char** argv)
{
unsigned int seed = 134529; // RNG seed value
char badstring[100] = {'\0'};
char* goodstring = NULL;
size_t i = 0;
srand(seed); // seed RNG
 
unsigned //int 0seed <= x134529; <= 255// randomRNG charseed value
for(i=0; i<100; i++)
badstring[i] = (char) ( rand() & (char)0xFF );
 
enum {ASCII=0, EXT=1};
goodstring = strip( badstring, 50); // remove bad chars (limit 50)
 
unsigned char badstring[STR_SZ] = {'\0'};
fprintf(stdout, "%s\n" , goodstring );
unsigned char bs_2[STR_SZ] = {'\0'};
unsigned char* goodstring = NULL;
unsigned char* goodstring_ext = NULL;
 
 
return 0;
size_t i = 0;
 
srand(seed); // seed RNG
 
fprintf(stdout, "Original:\t" );
 
 
for (i = 0; i < STR_SZ; i++)
{
// set random 8 bit bytes in string (0 - 255)
badstring[i] = (unsigned char) ( rand () & (unsigned char)0xFF );
fprintf(stdout, "%c", badstring[i] );
}
 
fprintf(stdout, "\n");
 
 
memcpy(bs_2, badstring, STR_SZ * sizeof(unsigned char) ); /* copy string */
 
goodstring_ext = strip( badstring, STR_SZ, EXT); // remove non extended and non ascii
 
fprintf(stdout, "\nEXT:\t%s\n" , goodstring_ext );
 
goodstring = strip( bs_2, STR_SZ, ASCII); // remove non ascii
fprintf(stdout, "\nASCII:\t%s\n" , goodstring );
return 0;
}</lang>
 
{{out}}
input: ��v��8Dž�אB�����8ln9V�D��z�@�T�]��Z����wo������8W��v��8Dž�אB�����8ln9V�D��z�@�T�]��Z����wo� ... -> 100 chars
<span style="color:blue;font-size:1em">
Original: ƒ˜v�ý8Ç…Ø×�B„…â¤Ê8ln9V¢DèÝz�@ÅTÃ]ÊÙZ� ßÚwo�ûôÿ ¾8
,qcζK¬0aìõ¶¯R€ˆ­ƒ(Œ]Ÿüz›ðz;¯²GÛ#ªªÙöV WñQŽyþ�¡
</span>
<span style="color:black;font-size:1em">
EXT: ƒ˜vý8Ç…Ø×�B„…â¤Ê8ln9V¢DèÝz@ÅTÃ]ÊÙZ ßÚwoûôÿ ¾8,qcζK¬0aìõ¶¯R€ˆ­ƒ(Œ]Ÿüz›ðz;¯²GÛ#ªªÙöVWBþñQŽyþ¡
</span>
 
<span style="color:blue;font-size:1em">
output: v8B8ln9VDz@T]Zwo8
ASCII: v8B8ln9VDz@T]Zwo8,qcK0aR(]zz;G#VWBQy
</span>