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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
| size_t InPlaceSplit(char *str, char ** pointers, size_t nPointers, char sep)
{
size_t iPointer = 0;
//Premier pointeur, si on commence par un caractère valide
if(str[0] != sep)
{
if(pointers!=NULL && iPointer<nPointers)
pointers[iPointer++] = str;
}
//pointeurs suivants
for(size_t i=0 ; str[i] != '\0' ; i++)
{
if(str[i] == sep)
{
//Ne modifier la chaîne que si on a un buffer non-nul et non-vide
if(pointers!=NULL && nPointers != 0)
str[i] = '\0';
//Faire pointer la nouvelle sous-chaine sur le caractère suivant.
if(pointers!=NULL && iPointer<nPointers)
pointers[iPointer++] = str + i + 1;
}
}
return iPointer;
}
size_t InPlaceSplit(wchar_t *str, wchar_t ** pointers, size_t nPointers, wchar_t sep)
{
size_t iPointer = 0;
//Premier pointeur, si on commence par un caractère valide
if(str[0] != sep)
{
if(pointers!=NULL && iPointer<nPointers)
pointers[iPointer++] = str;
}
//pointeurs suivants
for(size_t i=0 ; str[i] != L'\0' ; i++)
{
if(str[i] == sep)
{
//Ne modifier la chaîne que si on a un buffer non-nul et non-vide
if(pointers!=NULL && nPointers != 0)
str[i] = L'\0';
//Faire pointer la nouvelle sous-chaine sur le caractère suivant.
if(pointers!=NULL && iPointer<nPointers)
pointers[iPointer++] = str + i + 1;
}
}
return iPointer;
}
char ** AllocInPlaceSplit(char *str, char sep)
{
size_t nPointers = InPlaceSplit(str, NULL, 0, sep);
size_t nPointersWithNull = nPointers+1;
char** pointers = malloc(nPointersWithNulls * sizeof *pointers);
if(pointers)
{
pointers[nPointers] = NULL;
InPlaceSplit(str, pointers, nPointers, sep);
assert(pointers[nPointers] == NULL);
}
return pointers;
}
wchar_t ** AllocInPlaceSplit(wchar_t *str, wchar_t sep)
{
size_t nPointers = InPlaceSplit(str, NULL, 0, sep);
size_t nPointersWithNull = nPointers+1;
wchar_t** pointers = malloc(nPointersWithNulls * sizeof *pointers);
if(pointers)
{
pointers[nPointers] = NULL;
InPlaceSplit(str, pointers, nPointers, sep);
assert(pointers[nPointers] == NULL);
}
return pointers;
}
std::vector<char *> AllocInPlaceSplitV(char *str, char sep)
{
size_t nPointers = InPlaceSplit(str, NULL, 0, sep);
size_t nPointersWithNull = nPointers+1;
std::vector<char *> pointers(nPointersWithNull);
if(pointers)
{
pointers[nPointers] = NULL;
InPlaceSplit(str, &pointers[0], nPointers, sep);
assert(pointers[nPointers] == NULL);
}
return pointers;
}
std::vector<wchar_t *> AllocInPlaceSplitV(wchar_t *str, wchar_t sep)
{
size_t nPointers = InPlaceSplit(str, NULL, 0, sep);
size_t nPointersWithNull = nPointers+1;
std::vector<wchar_t *> pointers(nPointersWithNulls);
if(pointers)
{
pointers[nPointers] = NULL;
InPlaceSplit(str, &pointers[0], nPointers, sep);
assert(pointers[nPointers] == NULL);
}
return pointers;
} |
Partager