Hello

Your C code is broken somwhat, let's see:

extern char * danCGIReplacedCRLF(char * szFixMe){ int i,j,iLen=0,iNewLen=0; int iCRLFcount=0; char* szResult=NULL; iLen=strlen(szFixMe); for (i=0;i<=iLen;i++){ /* this should be i < len */ if (szFixMe[i]==(int) '\n' || szFixMe[i]==(int) '\r') iCRLFcount++; /* and here you're counting how many \r or \n you see, not how many "\r\n" sequences */ } /* you don't need the <p>+NULL+text, you need <p>+text */ // need space for first <p> +NULL+ text // + replace each CR &LF + last " <\p>" iNewLen=3+1+strlen(szFixMe)+(iCRLFcount*8)+5; szResult = malloc(iNewLen); if (szResult){ /* what's wrong with strcpy(szResult, "<p>"); ? */ szResult[0]='<'; szResult[1]='p'; szResult[2]='>'; szResult[3]='\0'; i=0; j=3; while (i<=iLen) if (szFixMe[i]==(int) '\n' || szFixMe[i]==(int) '\r'){ /* here again, you're checking for \r or \n, now the pair */ strcat(szResult," </p><p>"); j+=8; /* and now I'm completely lost!, why are you looking for \n\r? I thought we were looking for \r\n. */ // deal with Newline CR pairs if(szFixMe[i]==(int) '\n' && szFixMe[i+1]==(int) '\r' || szFixMe[i]==(int) '\r' || szFixMe[i+1]==(int) ' +\n') i+=2; else i++; }else{ szResult[j]=szFixMe[i]; j++; szResult[j]='\0'; //dest string in strcat needs termin +ating \0 i++; } //outer loop & if statement //end of new document needs </p> to match at start strcat(szResult," </p>"); } // if(szResult !=NULL ) return szResult; }
Hmmm, I don't think this C code even comes closely to the Perl code given by you. Here one way to do it. This code aims to be simple and fast, rather than optimally fast. Enjoy :-).
/*********************************************************/ #if 0 we want to do the following: sub MakePtag{ my ($fixme)=@_; # take in our parameters $fixme='<p>'.$fixme; # Prepend a <p> tag to our string $fixme=~s|(\r\n)|</p><p>|g; # replace all \r\n with <\p><p> $fixme.='</p>'; # Append closing </p> tag return $fixme; } #endif char* make_p_tag(char* str){ int len = 0; int cr = 0; /* this will tell you if we found \r */ char *s = str; char *newstr, *s2; /* s#\r\n#<p></p>#, increases len by 5 (7-2)*/ while(*s != '\0'){ /* while we have more data */ ++len; if(*s == '\r'){ cr = 1; /* we found one */ } else if(*s == '\n' && cr){ /* we found \n and \r in the prev step */ cr = 0; /* forget we found a \r */ len += 5; } else { cr = 0; /* also forget we found an isolated \r*/ } ++s; } s = str; s2 = newstr = calloc(len+8, sizeof(char)); strcpy(s2,"<p>"); s2 += 3; while(*s != '\0'){ *s2 = *s; /* copy this char to the output string */ if(*s == '\r'){ cr = 1; /* mark that we put a \r */ } else if(*s == '\n' && cr){ /* now we placed \r\n */ cr = 0; strcpy(s2-1,"</p><p>"); /* put </p><p> */ s2 += 5; /* and advance */ } else { cr = 0; /* forget it */ } ++s; ++s2; } strcpy(s2,"</p>"); /* put terminating </p> */ s2+=4; *s2 = '\0'; return newstr; }
Hope this helps.

PS: You need </P> not <\P>
PS2: I know this is the *Perl* monastery, but I thought this shouldn't hurt :-)

Update: meant to say strcpy instead of strcat:

/* what's wrong with strcpy(szResult, "<p>"); ? */

In reply to Re: C vs perl by abstracts
in thread C vs perl by mandog

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.