2005-02-18 [colin] 1.0.1cvs14.1
[claws.git] / src / quote_fmt_lex.l
index 4216b64542e2236f0e1de1c68d75e6ef30faff68..04975d63ee4877667fbd64b4fe119f70676e5f9a 100644 (file)
@@ -1,35 +1,80 @@
 %{
 #include "quote_fmt_lex.h"
 #include "quote_fmt_parse.h"
+
+#define YY_NO_UNPUT 1
 %}
 
 %option prefix="quote_fmt"
 %option outfile="lex.yy.c"
 
+%s S_NORMAL S_DATE
+
+%{
+/*
+ * see notes below.
+ */
+int quote_fmt_firsttime = 1;
+%}
+
 %%
 
-"%d" /* date */ return SHOW_DATE;
-"%f" /* From */ return SHOW_FROM;
-"%N" /* Full name */ return SHOW_FULLNAME;
-"%F" /* firt name */ return SHOW_FIRST_NAME;
-"%I" /* initial of sender */ return SHOW_SENDER_INITIAL;
-"%s" /* subject */ return SHOW_SUBJECT;
-"%t" /* to */ return SHOW_TO;
-"%c" /* cc */ return SHOW_CC;
-"%n" /* newsgroups */ return SHOW_NEWSGROUPS;
-"%i" /* message-id */ return SHOW_MESSAGEID;
-"%r" /* references */ return SHOW_REFERENCES;
-"%M" /* message */ return SHOW_MESSAGE;
-"%Q" /* quoted message */ return SHOW_QUOTED_MESSAGE;
-"%m" /* message with no signature */ return SHOW_MESSAGE_NO_SIGNATURE;
-"%q" /* quoted message with no signature */ return SHOW_QUOTED_MESSAGE_NO_SIGNATURE;
-"%%" /* % */ return SHOW_PERCENT;
+%{
+/*
+ * NOTES:
+ * this lex script used to use characters also in use
+ * by strftime() (which we want to use for custom
+ * time formats in replies and templates). to circumvent
+ * this we have to play a little bit with states.
+ *
+ * these are the characters we also want to use in the
+ * %D time customizer:
+ *
+ * %a %A %b %B %c %C %d %H %I %j %m %M %p %S %w %x %y %Y %Z
+ *
+ * you can use these characters too, but don't forget to
+ * prepend them with the <S_NORMAL> state.
+ *
+ * also there is also work around for resetting the state
+ * (firsttime variable). this assumes that yylex() will
+ * always return to S_NORMAL after quote fmt parsing is
+ * done.
+ */
+%} 
+
+%{
+       if (quote_fmt_firsttime) {
+               BEGIN S_NORMAL;
+               quote_fmt_firsttime = 0;
+       }       
+%}
+
+<S_NORMAL>"%X" /* cursor pos */ return SET_CURSOR_POS;
+<S_NORMAL>"%c" /* cc */ return SHOW_CC;
+<S_NORMAL>"%d" /* date */ return SHOW_DATE;
+<S_NORMAL>"%D" /* date */ { BEGIN S_DATE; return SHOW_DATE_EXPR; }
+<S_NORMAL>"%f" /* from */ return SHOW_FROM;
+<S_NORMAL>"%F" /* first name */ return SHOW_FIRST_NAME;
+<S_NORMAL>"%i" /* message-id */ return SHOW_MESSAGEID;
+<S_NORMAL>"%I" /* initial of sender */ return SHOW_SENDER_INITIAL;
+<S_NORMAL>"%m" /* message with no signature */ return SHOW_MESSAGE_NO_SIGNATURE;
+<S_NORMAL>"%M" /* message */ return SHOW_MESSAGE;
+<S_NORMAL>"%n" /* newsgroups */ return SHOW_NEWSGROUPS;
+<S_NORMAL>"%N" /* full name */ return SHOW_FULLNAME;
+<S_NORMAL>"%L" /* last name */ return SHOW_LAST_NAME;
+<S_NORMAL>"%r" /* references */ return SHOW_REFERENCES;
+<S_NORMAL>"%s" /* subject */ return SHOW_SUBJECT;
+<S_NORMAL>"%t" /* to */ return SHOW_TO;
+<S_NORMAL>"%Q" /* quoted message */ return SHOW_QUOTED_MESSAGE;
+<S_NORMAL>"%q" /* quoted message with no signature */ return SHOW_QUOTED_MESSAGE_NO_SIGNATURE;
+"\\\%" /* % */ return SHOW_PERCENT;
 "\\\\" /* \ */ return SHOW_BACKSLASH;
-"\\t" /* tab */ return SHOW_TAB;
-"\\n" /* retour à la ligne */ return SHOW_EOL;
+"\\t"|"\t" /* tab */ return SHOW_TAB;
+"\\n"|"\n" /* return */ return SHOW_EOL;
 "\\?" /* ? */ return SHOW_QUESTION_MARK;
-"\\(" return SHOW_OPARENT;
-"\\)" return SHOW_CPARENT;
+"\\|" return SHOW_PIPE;
+"\\{" return SHOW_OPARENT;
+"\\}" return SHOW_CPARENT;
 "?d" /* query date */ return QUERY_DATE;
 "?f" /* query from */ return QUERY_FROM;
 "?N"|"?F"|"?I" /* query from name */ return QUERY_FULLNAME;
 "?n" /* query newsgroups */ return QUERY_NEWSGROUPS;
 "?i" /* query message-id */ return QUERY_MESSAGEID;
 "?r" /* query references */ return QUERY_REFERENCES;
-"(" return OPARENT;
-")" return CPARENT;
+"|f" /* insert file */ return INSERT_FILE;
+"|p" /* insert program output */ return INSERT_PROGRAMOUTPUT;
+<S_DATE>"{" return OPARENT;
+<S_DATE>"}" { BEGIN S_NORMAL; return CPARENT; }
+<S_NORMAL>"{" return OPARENT;
+<S_NORMAL>"}" return CPARENT;
 . { yylval.chr = yytext[0]; return CHARACTER; }
 
 %%