1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| bool ACG_IMPORT WORD97_ChangeString(ObCharFld &RS, ObCharFld &OldHeader, ObCharFld &OldSeparator, ObCharFld &NewHeader, ObCharFld &NewSeparator)
{
int len_olds;
int len_newh = 10240;
int len_news;
int n;
char *oldh = OldHeader.GetText();
char *olds = OldSeparator.GetText();
char *newh;
char news[128];
if (!Is_FCT_loaded(Convert))
Convert = (TConvert)GetProcAddress(word_hm, "Convert");
if (!Is_FCT_loaded_Msg(Convert))
return (false);
/* verification des parametres pour eviter un SEGVIO */
if (!NewSeparator.GetText() || !oldh || !olds || (len_olds = strlen(olds)) == 0 || (len_news = Convert(news, NewSeparator.GetText())) == 0 ||
strncmp(oldh, olds, len_olds))
{
RS.SetText("ERR");
return false;
}
oldh += len_olds; // suppression du separateur en debut de chaine
/* allocation d'une chaine pour le nouvel header */
newh = new char [len_newh];
n = 0;
newh[n++] = '\"';
while (*oldh)
{
if (!strncmp(oldh, olds, len_olds))
{
/* C'est un separateur => remplacer par le nouveau separateur */
strcpy_s(&newh[n], len_newh, news); /* remplace par le nouveau separateur */
while (newh[n]) n++; /* se positionne a la fin */
oldh += len_olds; /* deplacement dans la chaine */
}
else
/* C'est un caractere comme un autre */
newh[n++] = *oldh++;
/* petit test pour eviter que le buffer soit trop petit */
if (n >= len_newh - len_news - 1)
{
char *tmp;
int new_len;
new_len = len_newh * 2;
tmp = new char [new_len];
memcpy(tmp, newh, len_newh);
newh = tmp;
len_newh = new_len;
}
}
/* fermeture du nouvel header */
newh[n++] = '\"';
newh[n] = '\0';
NewHeader.SetText(newh);
RS.SetText(" ");
return true;
} |
Partager