Пример #1
0
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);
}
Пример #2
0
/* 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;
}
Пример #3
0
/* 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;
}
Пример #4
0
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
}