/* copie une portion d'une chaine dans une autre */ #include #include #include #include "etc.h" /* copie un mot d'une chaine str dans une chaine dest Un mot est une suite de caractère contigue répondant au critère isgraph() Saute les blancs au début de str Retourne l'adresse du premier caractère après le mot dans la chaine Retourne NULL si la chaine ne contenait pas de mot. La chaine dest est toujours terminée même s'il n'y a pas de mot. */ export char *str_copymot ( char *dest, /* recoit le mot */ const char *str) { char *ret = NULL; while (isspace(*str)) str++; if (*str > ' '){ while (*str>' ') *dest++ = *str++; ret = (char*) str; } *dest = '\0'; return (ret); } /* copie le n'ième mot d'une chaine str dans une chaine dest Un mot est une suite de caractère contigue répondant au critère isgraph() Saute les blancs au début de str Retourne l'adresse du premier caractère après le mot dans la chaine Retourne NULL si la chaine ne contenait pas de nomot mot. La chaine dest est toujours terminée même s'il n'y a pas de mot. */ export char *str_copymotn ( char *dest, /* recoit le mot */ const char *str, int nomot) /* Numéro du mot, 0 ... */ { while ((str=str_copymot(dest,str))!=NULL && nomot > 0) nomot--; return (char*)str; } #if 0 /* copie une séquence englobé entre deux caractère quote. Le premier caractère de str est le caractère quote. Deux caractères quote qui se suivent seront interpréter comme un seul et incorporé dans la séquence. Le caractère escape est généralement '\\'. Retourne l'adresse du premier caractère après le caractère quote de fermeture dans str. UN PEU REDONDANT par rapport à lexc\token_copystring (sauf compilation) Les caractères quotes ne sont pas copiés. */ export char *str_copyquotec ( char *dest, /* contiendra la séquence entre les deux caractères */ /* quote. Peut être NULL, ca permet de trouver */ /* la fin */ const char *str,/* chaine commençant par un caractère quote */ char escape, /* Généralement '\\' ou '\0' si absent */ int compile) /* Interprète les escapes ou laisse comme ça */ { char quote = *str++; char dummy[10]; int copie = 1; if (dest == NULL){ dest = dummy; copie = 0; } while (*str != '\0'){ if (!copie) dest = dummy; if (*str == quote){ str++; if (*str == quote){ if (!compile) *dest++ = quote; *dest++ = *str++; }else{ break; } }else if (*str == escape){ str++; if (compile){ char res=*str; switch (*str){ case 'b': res = '\b'; break; case 'f': res = '\f'; break; case 'n': res = '\n'; break; case 'r': res = '\r'; break; case 'a': res = '\a'; break; default: if (isdigit(*str)){ int base = 8; while (1){ char carac = *str; if (isdigit(carac)){ res = (char)(res * base + carac - '0'); }else if (carac == 'x' || carac == 'X'){ base = 16; }else if (isxdigit(carac) || base == 16){ res = (char)(res * base + (carac & 0xf) + 9); }else{ break; } } } } str++; *dest++ = res; }else{ *dest++ = escape; if (*str != '\0') *dest++ = *str++; } }else{ *dest++ = *str++; } } *dest = '\0'; return (char*)str; } /* copie une séquence englobé entre deux caractère quote. Le premier caractère de str est le caractère quote. Deux caractères quote qui se suivent seront interpréter comme un seul et incorporé dans la séquence. Retourne l'adresse du premier caractère après le caractère quote de fermeture dans str. Les caractères quotes ne sont pas copiés. */ export char *str_copyquote ( char *dest, /* contiendra la séquence entre les deux caractères */ /* quote. Peut être NULL, ca permet de trouver */ /* la fin */ const char *str)/* chaine commençant par un caractère quote */ { return str_copyquotec(dest,str,'\0',1); } #endif /* Copie une expression entre parenthèse avec sous parenthèse. Retourne adresse après la parenthèse de fermeture. *ptaccum recevra l'expression incluant les parenthèses. */ export char *str_copypar0 ( char **ptaccum, /* Pointera après parenthèse de fermeture */ const char *str) { char *accum = *ptaccum; *accum++ = *str++; while (*str != '\0' && *str != ')'){ if (*str == '('){ str = str_copypar0 (&accum,str); }else{ *accum++ = *str++; } } if (*str != '\0') *accum++ = *str++; *accum = '\0'; *ptaccum = accum; return (char*) str; } /* Copie une expression entre parenthèse avec sous parenthèse. Retourne adresse après la parenthèse de fermeture. accum recevra l'expression incluant les parenthèses. */ export char *str_copypar (char *accum, const char *str) { return str_copypar0 (&accum,str); }