#include #include "lexc.h" /* Détermine la fin d'une string ptl pointe sur le premier " Retourne pointeur sur le " de fermeture ou '\0' si erreur lexicale */ export char *token_skipstring (const char *ptl) { ptl++; while (*ptl != '\0'){ int carac = *ptl++; if (carac == '\\' && (*ptl == '"' || *ptl == '\\')){ ptl++; }else if (carac == '"'){ if (*ptl != '"'){ ptl--; break; } ptl++; } } return (char*)ptl; } /* extrait une chaine de caractère (guillemet double) d'une chaine Retourne pointeur après le " ou pointe à la fin de la chaine Retourne un pointeur sur n'importe quoi si lenmax est excédé */ export char *token_copystring ( char *text, /* destination */ char *ptl, /* chaine a lire */ int lenmax) /* longuer maximum */ { char *endptl = token_skipstring(ptl); int lenptl = (int)(endptl-ptl)+1; if (lenptl > lenmax){ lexcerr_bprintf ("Constante caractère trop longue\n" ,"Character constant too long\n"); lenptl = lenmax; } memmove (text,ptl,lenptl); text[lenptl] = '\0'; if (*endptl == '\0'){ lexcerr_bprintf ("Chaine de caractères non terminée\n" ,"Unterminated character string\n"); }else{ endptl++; } return (endptl); } /* Saute définition d'un caractère entre guillemet simple ptl pointe sur le premier ' Retourne pointeur sur le ' de fermeture ou '\0' si erreur lexicale */ export char *token_skipquote (const char *ptl) { ptl++; while (*ptl != '\0' && *ptl != '\''){ int carac = *ptl++; if (carac == '\\' && (*ptl == '\'' || *ptl == '\\')){ ptl++; } } return (char*)ptl; } /* extrait un caractère (guillemet simple) d'une chaine Retourne pointeur après le ' ou pointe à la fin de la chaine Retourne un pointeur sur n'importe quoi si lenmax est excédé */ export char *token_copyquote ( char *text, /* destination */ char *ptl, /* chaine à lire */ int lenmax) /* longueur maximum admissible */ { char *endptl = token_skipquote(ptl); int lenptl = (int)(endptl-ptl)+1; if (lenptl >=lenmax){ lexcerr_bprintf ("Constante caractère trop longue\n" ,"Character constant too long\n"); lenptl = lenmax-1; } memmove (text,ptl,lenptl); text[lenptl] = '\0'; if (*endptl == '\0'){ lexcerr_bprintf ("Chaine de caractères non terminée\n" ,"Unterminated character string\n"); }else{ endptl++; } return endptl; }