Article View: be.comp.programming
Article #12746Re: C string (char pointer) naar perl litteral
From: Heine Broers
Date: Sun, 07 Oct 2001 12:03
Date: Sun, 07 Oct 2001 12:03
113 lines
4114 bytes
4114 bytes
Philip Van Hoof wrote:
> Ik ben momenteel bezig met "iets" te maken dat een
> (char *) in C omzet naar een perl litteral ...
>
> bv dus ..
>
> mijn C prog heeft dit in (char *str;) zitten (zonder de xml tags, ehm
> is wel geen xml want xml zou die chars ook vervangen. Enkel ter
> aanduiding):
>
> <str>ik ben'een string en ik heb \een aantal'speciale karaters</str>
>
> En mijn C prog moet daarvan een nieuwe string maken waar dan in
> zal zitten :
> <str>ik ben\'een string en ik heb \\een aantal\'speciale karaters</str>
>
> nota: de nieuwe string is daadwerkelijk 3 bytes groter ja.
> Dit dus he :
> printf("ik ben\\\'een string en ik heb \\een aantal\\\'speciale karaters\n");
> Zodat we elkaar niet verkeerd begrijpen hier :)
>
> Extra : het teken '|' moet ook vervangen worden door :
> <vervanger>&verti&kaal&stre&epke;</vervanger
>
Ik mis veelal het commando strstr(...,...)
Dit is erg handig bij het doorzoeken van strings in C
>
> Momenteel doe ik dit zo :
>
>
> #define REPLACECHAR '|'
> #define REPLACEBY "&verti&kaal&stre&epke;"
>
> int itemdata2perl(char *ItemDataIn, char **ItemDataOut) {
> int size=0, size_s=0, i=0, x=0,
> spcharcount=0, addrep;
> char *ItemData;
>
> addrep=strlen(REPLACEBY)-1;
> size_s=size=strlen(ItemDataIn);
> for (i=0; i<strlen(ItemDataIn); i++) {
> if ((ItemDataIn[i] == '\'') || (ItemDataIn[i] == '\\')) {
> size++;
> }
> if (ItemDataIn[i] == REPLACECHAR) {
> size += addrep;
> }
> size++;
> }
> ItemData = (char*) malloc(size); i=0;
> for (x=0; x<size_s; x++) {
> if (ItemDataIn[x] == '\'') {
> ItemData[i]='\\'; i++;
> ItemData[i]='\'';
> } else if (ItemDataIn[x] == '\\') {
> ItemData[i]='\\'; i++;
> ItemData[i]='\\';
> } else if (ItemDataIn[x] == '|') {
> strcat(ItemData, REPLACEBY);
> i += addrep;
> } else {
> ItemData[i]=ItemDataIn[x];
> }
> i++;
> }
> *ItemDataOut = ItemData;
> return i;
> }
>
>
> char *strin, *strout;
> int length;
> strin = (char*) malloc(100);
> fgets(strin,100,stdin);
> ....
> length = itemdata2perl(strin, &strout);
>
> of dus.. als je str wil "bewerken"
> itemdata2perl(str, &str);
>
> En dat blijkt te werken... zoals een goede bedrijfs programmeur
> dus zou zeggen : "werkt et .. lot et dan doen!" zou ik het moeten
> laten zoals het is :-\ .. maar da ben ik nie.. :
>
> Dit alloceerd minstens twee keer zoveel geheugen dan dat de string
> groot is. Het is mogelijk dat die "string" 20 MB groot is .. en/of
> dat die vol zit met | , ' en \ karakters .. met als gevolg dat er
> tot 23keer (zo lang is REPLACEBY) zoveel geheugen extra wordt
> gealloceerd...
>
> .. ik zoek dus een efficientere manier..
>
> :)
>
> had ik maar perl eh :-\
> $str =~ s/\'/\\\'/g; .. ofzo
>
> Is er geen regex lib ofzo voor C ? zou het in ieder geval een stuk
> makkelijker maken voor "veel" van mijn probjes in C ..
>
>
>
>
--
See also: http://www.cybercomm.nl/~broers
Technical Details
Message-ID:
<3BC044A3.6040907@cybercomm.nl>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!supernews.com!news.tele.dk!small.news.tele.dk!195.64.68.27!newsgate.cistron.nl!bigmama.cybercomm.nl!not-for-mailReferences:
<pan.2001.10.02.13.08.16.628.1203@glasshouse.be>Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit X-Google-Thread: fcea4,d4cbae6d59ca0116 X-Google-Attributes: gidfcea4,public X-Google-ArrivalTime: 2001-10-07 05:14:15 PST Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!supernews.com!news.tele.dk!small.news.tele.dk!195.64.68.27!newsgate.cistron.nl!bigmama.cybercomm.nl!not-for-mail Message-ID: <3BC044A3.6040907@cybercomm.nl> From: Heine Broers <broers@cybercomm.nl> User-Agent: Mozilla/5.0 (Windows; U; Win98; en-US; rv:0.9.2) Gecko/20010726 Netscape6/6.1 X-Accept-Language: en-us MIME-Version: 1.0 Newsgroups: be.comp.programming Subject: Re: C string (char pointer) naar perl litteral References: <pan.2001.10.02.13.08.16.628.1203@glasshouse.be> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Lines: 114 Date: Sun, 07 Oct 2001 14:03:47 +0200 NNTP-Posting-Host: 213.196.14.44 X-Complaints-To: newsmaster@cybercomm.nl X-Trace: bigmama.cybercomm.nl 1002456327 213.196.14.44 (Sun, 07 Oct 2001 14:05:27 CEST) NNTP-Posting-Date: Sun, 07 Oct 2001 14:05:27 CEST