void script_backup(donnees_script *script) { char filename[PATH_MAX]; FILE *file; int groups_nb, links_nb; type_groupe *group; type_liaison * link; groups_nb = script_get_groups_nb(script); links_nb = 0; for (link = script->deb_liaison; link != NULL; link = link->s) { links_nb++; }; sprintf(filename, "%s.bak%i", script->nomfich1, script->backup_id); script->backup_id++; prepare_affichage(script); file = fopen(filename, "w"); save_comment(file, script->first_comment_group); fprintf(file, "nombre de groupes = %d\n", groups_nb); for (group = script->deb_groupe; group != NULL; group = group->s) { write_one_group(file, group, 1, script->infos_xyz[group->no-1]); } save_comment(file, script->first_comment_link); fprintf(file, "nombre de liaisons = %d\n", links_nb); for (link = script->deb_liaison; link != NULL; link = link->s) { write_one_link(file, link, 1); } fclose(file); }
/* Lex a token into pfile->cur_token, which is also incremented, to get diagnostics pointing to the correct location. Does not handle issues such as token lookahead, multiple-include optimization, directives, skipping etc. This function is only suitable for use by _cpp_lex_token, and in special cases like lex_expansion_token which doesn't care for any of these issues. When meeting a newline, returns CPP_EOF if parsing a directive, otherwise returns to the start of the token buffer if permissible. Returns the location of the lexed token. */ cpp_token * _cpp_lex_direct (cpp_reader *pfile) { cppchar_t c; cpp_buffer *buffer; const unsigned char *comment_start; cpp_token *result = pfile->cur_token++; fresh_line: result->flags = 0; buffer = pfile->buffer; if (buffer->need_line) { if (!_cpp_get_fresh_line (pfile)) { result->type = CPP_EOF; if (!pfile->state.in_directive) { /* Tell the compiler the line number of the EOF token. */ result->line = pfile->line; result->flags = BOL; } return result; } if (!pfile->keep_tokens) { pfile->cur_run = &pfile->base_run; result = pfile->base_run.base; pfile->cur_token = result + 1; } result->flags = BOL; if (pfile->state.parsing_args == 2) result->flags |= PREV_WHITE; } buffer = pfile->buffer; update_tokens_line: result->line = pfile->line; skipped_white: if (buffer->cur >= buffer->notes[buffer->cur_note].pos && !pfile->overlaid_buffer) { _cpp_process_line_notes (pfile, false); result->line = pfile->line; } c = *buffer->cur++; result->col = CPP_BUF_COLUMN (buffer, buffer->cur); switch (c) { case ' ': case '\t': case '\f': case '\v': case '\0': result->flags |= PREV_WHITE; skip_whitespace (pfile, c); goto skipped_white; case '\n': pfile->line++; buffer->need_line = true; goto fresh_line; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': result->type = CPP_NUMBER; lex_number (pfile, &result->val.str); break; case 'L': /* 'L' may introduce wide characters or strings. */ if (*buffer->cur == '\'' || *buffer->cur == '"') { lex_string (pfile, result, buffer->cur - 1); break; } /* Fall through. */ case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': result->type = CPP_NAME; result->val.node = lex_identifier (pfile, buffer->cur - 1); /* Convert named operators to their proper types. */ if (result->val.node->flags & NODE_OPERATOR) { result->flags |= NAMED_OP; result->type = result->val.node->directive_index; } break; case '\'': case '"': lex_string (pfile, result, buffer->cur - 1); break; case '/': /* A potential block or line comment. */ comment_start = buffer->cur; c = *buffer->cur; if (c == '*') { if (_cpp_skip_block_comment (pfile)) cpp_error (pfile, CPP_DL_ERROR, "unterminated comment"); } else if (c == '/' && (CPP_OPTION (pfile, cplusplus_comments) || CPP_IN_SYSTEM_HEADER (pfile))) { /* Warn about comments only if pedantically GNUC89, and not in system headers. */ if (CPP_OPTION (pfile, lang) == CLK_GNUC89 && CPP_PEDANTIC (pfile) && ! buffer->warned_cplusplus_comments) { cpp_error (pfile, CPP_DL_PEDWARN, "C++ style comments are not allowed in ISO C90"); cpp_error (pfile, CPP_DL_PEDWARN, "(this will be reported only once per input file)"); buffer->warned_cplusplus_comments = 1; } if (skip_line_comment (pfile) && CPP_OPTION (pfile, warn_comments)) cpp_error (pfile, CPP_DL_WARNING, "multi-line comment"); } else if (c == '=') { buffer->cur++; result->type = CPP_DIV_EQ; break; } else { result->type = CPP_DIV; break; } if (!pfile->state.save_comments) { result->flags |= PREV_WHITE; goto update_tokens_line; } /* Save the comment as a token in its own right. */ save_comment (pfile, result, comment_start, c); break; case '<': if (pfile->state.angled_headers) { lex_string (pfile, result, buffer->cur - 1); break; } result->type = CPP_LESS; if (*buffer->cur == '=') buffer->cur++, result->type = CPP_LESS_EQ; else if (*buffer->cur == '<') { buffer->cur++; IF_NEXT_IS ('=', CPP_LSHIFT_EQ, CPP_LSHIFT); } else if (*buffer->cur == '?' && CPP_OPTION (pfile, cplusplus)) { buffer->cur++; IF_NEXT_IS ('=', CPP_MIN_EQ, CPP_MIN); } else if (CPP_OPTION (pfile, digraphs)) { if (*buffer->cur == ':') { buffer->cur++; result->flags |= DIGRAPH; result->type = CPP_OPEN_SQUARE; } else if (*buffer->cur == '%') { buffer->cur++; result->flags |= DIGRAPH; result->type = CPP_OPEN_BRACE; } } break; case '>': result->type = CPP_GREATER; if (*buffer->cur == '=') buffer->cur++, result->type = CPP_GREATER_EQ; else if (*buffer->cur == '>') { buffer->cur++; IF_NEXT_IS ('=', CPP_RSHIFT_EQ, CPP_RSHIFT); } else if (*buffer->cur == '?' && CPP_OPTION (pfile, cplusplus)) { buffer->cur++; IF_NEXT_IS ('=', CPP_MAX_EQ, CPP_MAX); } break; case '%': result->type = CPP_MOD; if (*buffer->cur == '=') buffer->cur++, result->type = CPP_MOD_EQ; else if (CPP_OPTION (pfile, digraphs)) { if (*buffer->cur == ':') { buffer->cur++; result->flags |= DIGRAPH; result->type = CPP_HASH; if (*buffer->cur == '%' && buffer->cur[1] == ':') buffer->cur += 2, result->type = CPP_PASTE; } else if (*buffer->cur == '>') { buffer->cur++; result->flags |= DIGRAPH; result->type = CPP_CLOSE_BRACE; } } break; case '.': result->type = CPP_DOT; if (ISDIGIT (*buffer->cur)) { result->type = CPP_NUMBER; lex_number (pfile, &result->val.str); } else if (*buffer->cur == '.' && buffer->cur[1] == '.') buffer->cur += 2, result->type = CPP_ELLIPSIS; else if (*buffer->cur == '*' && CPP_OPTION (pfile, cplusplus)) buffer->cur++, result->type = CPP_DOT_STAR; break; case '+': result->type = CPP_PLUS; if (*buffer->cur == '+') buffer->cur++, result->type = CPP_PLUS_PLUS; else if (*buffer->cur == '=') buffer->cur++, result->type = CPP_PLUS_EQ; break; case '-': result->type = CPP_MINUS; if (*buffer->cur == '>') { buffer->cur++; result->type = CPP_DEREF; if (*buffer->cur == '*' && CPP_OPTION (pfile, cplusplus)) buffer->cur++, result->type = CPP_DEREF_STAR; } else if (*buffer->cur == '-') buffer->cur++, result->type = CPP_MINUS_MINUS; else if (*buffer->cur == '=') buffer->cur++, result->type = CPP_MINUS_EQ; break; case '&': result->type = CPP_AND; if (*buffer->cur == '&') buffer->cur++, result->type = CPP_AND_AND; else if (*buffer->cur == '=') buffer->cur++, result->type = CPP_AND_EQ; break; case '|': result->type = CPP_OR; if (*buffer->cur == '|') buffer->cur++, result->type = CPP_OR_OR; else if (*buffer->cur == '=') buffer->cur++, result->type = CPP_OR_EQ; break; case ':': result->type = CPP_COLON; if (*buffer->cur == ':' && CPP_OPTION (pfile, cplusplus)) buffer->cur++, result->type = CPP_SCOPE; else if (*buffer->cur == '>' && CPP_OPTION (pfile, digraphs)) { buffer->cur++; result->flags |= DIGRAPH; result->type = CPP_CLOSE_SQUARE; } break; case '*': IF_NEXT_IS ('=', CPP_MULT_EQ, CPP_MULT); break; case '=': IF_NEXT_IS ('=', CPP_EQ_EQ, CPP_EQ); break; case '!': IF_NEXT_IS ('=', CPP_NOT_EQ, CPP_NOT); break; case '^': IF_NEXT_IS ('=', CPP_XOR_EQ, CPP_XOR); break; case '#': IF_NEXT_IS ('#', CPP_PASTE, CPP_HASH); break; case '?': result->type = CPP_QUERY; break; case '~': result->type = CPP_COMPL; break; case ',': result->type = CPP_COMMA; break; case '(': result->type = CPP_OPEN_PAREN; break; case ')': result->type = CPP_CLOSE_PAREN; break; case '[': result->type = CPP_OPEN_SQUARE; break; case ']': result->type = CPP_CLOSE_SQUARE; break; case '{': result->type = CPP_OPEN_BRACE; break; case '}': result->type = CPP_CLOSE_BRACE; break; case ';': result->type = CPP_SEMICOLON; break; /* @ is a punctuator in Objective-C. */ case '@': result->type = CPP_ATSIGN; break; case '$': case '\\': { const uchar *base = --buffer->cur; if (forms_identifier_p (pfile, true)) { result->type = CPP_NAME; result->val.node = lex_identifier (pfile, base); break; } buffer->cur++; } default: create_literal (pfile, result, buffer->cur - 1, 1, CPP_OTHER); break; } return result; }
/* nom est le nom du script, si NULL alors on le demande en direct. */ void save_script_selected(int comment, int save_sub_networks, char *nom, TxDonneesFenetre *onglet_leto) { #ifndef AVEUGLE selected_group *sel_group; type_liaison * liaison; FILE *f1; int nbre_groupe_a_sauvegarder, nbre_liaison_a_sauvegarder; char nom_du_script[1024]; if (nom == NULL) { printf("nom du fichier pour la sauvegarde : "); if (scanf("%s", nom_du_script) != 1) PRINT_WARNING("Fail reading the filename"); } else memcpy(nom_du_script, nom, (strlen(nom) + 1) * sizeof(char)); nbre_groupe_a_sauvegarder = compte_nbre_groupe_propre_au_script(1); nbre_liaison_a_sauvegarder = compte_nbre_liaison_propre_au_script(1, onglet_leto); prepare_affichage(); /* position des groupes pour promethe,..., pb difficile! */ f1 = fopen(nom_du_script, "w"); if (f1 == NULL) { fprintf(stderr, "\n save_script_selected: Error while opening the network script %s\n", nom_du_script); exit(0); } /* lors de la relecture il ne faudra pas en plus relire les includes*/ if (save_sub_networks == 1) fprintf(f1, "%%!ignore_include \n"); if (comment == 1 && sc->first_comment_group != NULL) save_comment(f1, sc->first_comment_group); fprintf(f1, "nombre de groupes = %d\n", nbre_groupe_a_sauvegarder); for (sel_group = sc->groupes_courants; sel_group != NULL; sel_group = sel_group->next) { if (save_sub_networks == 1 || sel_group->group->deja_active == 0) write_one_group(f1, sel_group->group, comment, sc->infos_xyz[sel_group->group->no-1]); } if (comment == 1 && sc->first_comment_link != NULL) save_comment(f1, sc->first_comment_link); fprintf(f1, "nombre de liaisons = %d\n", nbre_liaison_a_sauvegarder); liaison = sc->deb_liaison; while (liaison != NULL) { if (save_sub_networks == 1 || liaison->deja_active == 0) { if (selected_link(liaison, onglet_leto) == 1) { write_one_link(f1, liaison, comment); } } liaison = liaison->s; } fclose(f1); #endif (void) comment; (void) save_sub_networks; (void) nom; (void) onglet_leto; }
void save_script(int comment, int save_sub_networks, TxDonneesFenetre *onglet_leto) { type_groupe *groupe; type_liaison * liaison; FILE *f1; int nbre_groupe_a_sauvegarder, nbre_liaison_a_sauvegarder; char nom_du_script[1024]; if (save_sub_networks == 1) /* on applatit tout le reseau pour pouvoir le simuler --> compilation */ { nbre_groupe_a_sauvegarder = sc->nbre_groupe; nbre_liaison_a_sauvegarder = sc->nbre_liaison; sprintf(nom_du_script, "%s", sc->nomfich1); } else { nbre_groupe_a_sauvegarder = compte_nbre_groupe_propre_au_script(0); nbre_liaison_a_sauvegarder = compte_nbre_liaison_propre_au_script(0, onglet_leto); memset(nom_du_script, 0, sizeof(char) * 1024); memcpy(nom_du_script, sc->nomfich1, (strlen(sc->nomfich1) + 1) * sizeof(char)); } prepare_affichage(); fprintf(stdout, "\nScript generated: %s\n", nom_du_script); f1 = fopen(nom_du_script, "w"); if (f1 == NULL) { EXIT_ON_ERROR("\n Error while opening the network script \n"); } if (save_sub_networks == 1) fprintf(f1, "%%!ignore_include \n"); /* lors de la relecture il ne faudra pas en plus relire les includes*/ if (comment == 1 && sc->first_comment_group != NULL) save_comment(f1, sc->first_comment_group); fprintf(f1, "nombre de groupes = %d\n", nbre_groupe_a_sauvegarder); groupe = sc->deb_groupe; while (groupe != NULL) { if (save_sub_networks == 1 || groupe->deja_active == 0) write_one_group(f1, groupe, comment, sc->infos_xyz[groupe->no-1]); groupe = groupe->s; } if (comment == 1 && sc->first_comment_link != NULL) save_comment(f1, sc->first_comment_link); fprintf(f1, "nombre de liaisons = %d\n", nbre_liaison_a_sauvegarder); liaison = sc->deb_liaison; while (liaison != NULL) { if (save_sub_networks == 1 || liaison->deja_active == 0) { write_one_link(f1, liaison, comment); } liaison = liaison->s; } fclose(f1); #ifndef AVEUGLE if (sc->draw[0] != '\0') xml_saveLiaisonFile(sc->deb_liaison, sc->draw); else { printf("Pour sauvegarder les coudes il faut un fichier .draw (sauvegarde dans provisoire.draw)\n"); xml_saveLiaisonFile(sc->deb_liaison, (gchar*)"provisoire.draw"); } #endif }