🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #12791

C string (char pointer) naar perl litteral

#12791
From: Philip Van Hoof
Date: Tue, 02 Oct 2001 11:08
103 lines
3866 bytes
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


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 ..



-- 
Philip van Hoof aka freax (http://www.freax.eu.org)
irc: irc.openprojects.net  mailto:freax at pandora.be
Linux programmer. mailto:philip.vanhoof at glasshouse.be
Technical Details
Message-ID: <pan.2001.10.02.13.08.16.628.1203@glasshouse.be>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!supernews.com!news.tele.dk!small.news.tele.dk!193.190.198.17!newsfeeds.belnet.be!news.belnet.be!ossa.telenet-ops.be!afrodite.telenet-ops.be.POSTED!not-for-mail

Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit
X-Google-Thread: fcea4,d4cbae6d59ca0116,start
X-Google-Attributes: gidfcea4,public
X-Google-ArrivalTime: 2001-10-02 04:08:14 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!supernews.com!news.tele.dk!small.news.tele.dk!193.190.198.17!newsfeeds.belnet.be!news.belnet.be!ossa.telenet-ops.be!afrodite.telenet-ops.be.POSTED!not-for-mail
From: "Philip Van Hoof" <philip.vanhoofREMOVE@glasshouse.be>
Subject: C string (char pointer) naar perl litteral
Newsgroups: be.comp.programming
Organization: Glasshouse
Message-ID: <pan.2001.10.02.13.08.16.628.1203@glasshouse.be>
User-Agent: Pan/0.10.0 (Unix)
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
X-Comment-To: ALL
Lines: 103
Date: Tue, 02 Oct 2001 11:08:11 GMT
NNTP-Posting-Host: 213.224.37.62
X-Complaints-To: abuse@pandora.be
X-Trace: afrodite.telenet-ops.be 1002020891 213.224.37.62 (Tue, 02 Oct 2001 13:08:11 MET DST)
NNTP-Posting-Date: Tue, 02 Oct 2001 13:08:11 MET DST