#pragma once

#include "software-modes.h"

// Construction d'un identificateur unique par le préprocesseur
// http://stackoverflow.com/questions/12697709/use-function-and-line-to-construct-identifier-name

#define CAT_FOR_UNIQUE_IDENTIFIER_2(a,b) a##b
#define CAT_FOR_UNIQUE_IDENTIFIER(a,b) CAT_FOR_UNIQUE_IDENTIFIER_2(a,b)
#define UNIQUE_IDENTIFIER CAT_FOR_UNIQUE_IDENTIFIER (zzUniqueIdentifier_, __COUNTER__)

// Inscrire l'adresse de la routine dans la section '"boot.routine.array' pour exécution automatique lors du démarrage

#define MACRO_BOOT_ROUTINE(ROUTINE) \
  static void (* UNIQUE_IDENTIFIER) (BOOT_MODE) \
  __attribute__ ((section ("boot.routine.array"))) \
  __attribute__ ((unused)) \
  __attribute__ ((used)) = ROUTINE ;

// Inscrire l'adresse de la routine dans la section 'init.routine.array' pour exécution automatique lors du démarrage

#define MACRO_INIT_ROUTINE(ROUTINE) \
  static void (* UNIQUE_IDENTIFIER) (INIT_MODE) \
  __attribute__ ((section ("init.routine.array"))) \
  __attribute__ ((unused)) \
  __attribute__ ((used)) = ROUTINE ;