/* Copyright (C) 2021-2024 Free Software Foundation, Inc.
   Contributed by Oracle.

   This file is part of GNU Binutils.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

#ifndef _EMSG_H
#define _EMSG_H

#include "Emsgnum.h"
#include "vec.h"

//
// The Emsg, experiment message, has as objects I18N'd messages
//	in a structure suitable for attaching to and fetching
//	from a queue of such messages.  It is intended to
//	be used for collector errors, collector warnings, parser
//	errors, and er_archive errors that are encountered when
//	reading an experiment

class Emsg;
class Emsgqueue;
class StringBuilder;

typedef enum
{
  CMSG_WARN = 0,
  CMSG_ERROR,
  CMSG_FATAL,
  CMSG_COMMENT,
  CMSG_PARSER,
  CMSG_ARCHIVE
} Cmsg_warn;

class Emsg
{
public:
  friend class Emsgqueue;

  Emsg (Cmsg_warn w, const char *i18n_text);
  Emsg (Cmsg_warn w, StringBuilder& sb);
  Emsg (Cmsg_warn w, int f, const char *param);
  ~Emsg ();

  char *
  get_msg ()
  {
    return text;
  };

  Cmsg_warn
  get_warn ()
  {
    return warn;
  };

  Emsg *next;       // next message in a queue

protected:
  Cmsg_warn warn;   // error/warning/...
  int flavor;       // the message flavor
  char *par;        // the input parameter string
  char *text;       // The I18N text of the message
};

class Emsgqueue
{
public:
  Emsgqueue (char *);
  ~Emsgqueue ();

  void append (Emsg*);
  Emsg *append (Cmsg_warn w, char *msg);
  Emsg *find_msg (Cmsg_warn w, char *msg);
  void appendqueue (Emsgqueue*);
  Emsg *fetch (void);
  void clear (void); // empty the queue
  void mark_clear (void); // mark the queue empty, without touching messages

protected:
  Emsg *first;
  Emsg *last;
  char *qname;
};

class DbeMessages
{
public:
  DbeMessages ();
  ~DbeMessages ();
  Vector<Emsg*> *msgs;
  void remove_msg (Emsg *msg);
  Emsg *get_error ();
  Emsg *append_msg (Cmsg_warn w, const char *fmt, ...)
	__attribute__ ((format (printf, 3, 4)));
  void append_msgs (Vector<Emsg*> *lst);
};

#endif  /* _EMSG_H */
