//#include <stdio.h>
#include <glib.h>

const gchar *params = "{lcrr@{...}l>{...}p{...}|l|c|r|r@{...}l|>{...}p{...}l|c|r|r@{...}l|>{...}p{...}||l||c||r||r@{...}l||>{...}p{...}|}";

int main (int argc, char *argv[])
{
  /* Print all uppercase-only words. */
  GRegex *regex;
  GMatchInfo *match_info;
  GError *error = NULL;
  GList *list_params = NULL,
        *it = NULL;
  gchar *reverse_params = g_strdup (params);
  reverse_params = g_strreverse (reverse_params);

  regex = g_regex_new ("("
                       "(\\||)}[^{}]+{p}[^{}]+{>(\\||)"
                       "|"
                       "(\\||)l}[^{}]+{@r(\\||)"
                       "|"
                       "(\\||)r(\\||)"
                       "|"
                       "(\\||)c(\\||)"
                       "|"
                       "(\\||)l(\\||)"
                       ")",
                       0, 0, NULL);
  g_regex_match_full (regex, reverse_params, -1, 0, 0, &match_info, &error);
  while (g_match_info_matches (match_info))
    {
      list_params = g_list_prepend (list_params, g_strreverse (g_match_info_fetch (match_info, 0)));
      g_match_info_next (match_info, &error);
    }
  g_match_info_free (match_info);
  g_regex_unref (regex);
  if (error != NULL)
    {
      g_printerr ("Error while matching: %s\n", error->message);
      g_error_free (error);
    }

  g_print ("%s\n", params);
  for (it = g_list_first (list_params); it; it = g_list_next (it))
    g_print ("Found: %s\n", (const gchar *) it->data);

  g_free (reverse_params);
  g_list_free_full (list_params, g_free);

  return 0;
}
