🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #12746

Re: C string (char pointer) naar perl litteral

#12746
From: Heine Broers
Date: Sun, 07 Oct 2001 12:03
113 lines
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-mail
References: <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