Article View: be.comp.programming
Article #12791C string (char pointer) naar perl litteral
From: Philip Van Hoof
Date: Tue, 02 Oct 2001 11:08
Date: Tue, 02 Oct 2001 11:08
103 lines
3866 bytes
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-mailShow 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