Index: gcalctool/calctool.c
===================================================================
RCS file: /cvs/gnome/gcalctool/gcalctool/calctool.c,v
retrieving revision 1.95
diff -u -r1.95 calctool.c
--- gcalctool/calctool.c	15 Sep 2005 16:45:27 -0000	1.95
+++ gcalctool/calctool.c	19 Sep 2005 14:24:08 -0000
@@ -827,7 +827,7 @@
     'M',
     M_NONE,
     do_calc,
-    NULL,
+    N_(" Mod "),
     binop
 },
 {
Index: gcalctool/ce_parser.y
===================================================================
RCS file: /cvs/gnome/gcalctool/gcalctool/ce_parser.y,v
retrieving revision 1.8
diff -u -r1.8 ce_parser.y
--- gcalctool/ce_parser.y	7 Feb 2005 16:38:58 -0000	1.8
+++ gcalctool/ce_parser.y	19 Sep 2005 14:24:08 -0000
@@ -62,6 +62,7 @@
 %token tINT
 %token tLN
 %token tLOG10
+%token tMOD
 %token tNOT
 %token tOR
 %token tPI
@@ -142,6 +143,11 @@
 value: 
   lexp {cp($1, $$);}
 | exp {cp($1, $$);}
+| tINUMBER tMOD tINUMBER {
+  if (calc_modulus($1, $3, $$)) {
+      parser_state.error = EINVAL;
+  }
+}
 ;
 
 lexp:
Index: gcalctool/ce_tokeniser.l
===================================================================
RCS file: /cvs/gnome/gcalctool/gcalctool/ce_tokeniser.l,v
retrieving revision 1.12
diff -u -r1.12 ce_tokeniser.l
--- gcalctool/ce_tokeniser.l	12 Sep 2005 16:58:10 -0000	1.12
+++ gcalctool/ce_tokeniser.l	19 Sep 2005 14:24:08 -0000
@@ -66,6 +66,7 @@
 "int" {return tINT;}
 "ln" {return tLN;}
 "log" {return tLOG10;}
+"mod" {return tMOD;}
 "not" {return tNOT;}
 "or" {return tOR;}
 "pi" {return tPI;}
Index: gcalctool/mpmath.c
===================================================================
RCS file: /cvs/gnome/gcalctool/gcalctool/mpmath.c,v
retrieving revision 1.9
diff -u -r1.9 mpmath.c
--- gcalctool/mpmath.c	7 Feb 2005 16:38:58 -0000	1.9
+++ gcalctool/mpmath.c	19 Sep 2005 14:24:08 -0000
@@ -18,6 +18,7 @@
  */
 
 #include <assert.h>
+#include <errno.h>
 
 #include "calctool.h"    /* FIXME: include only needed stuff. */
 #include "mpmath.h"
@@ -203,6 +204,25 @@
     mpmul(s1, MP1, t1);
 }
 
+int
+calc_modulus(int op1[MP_SIZE], 
+	     int op2[MP_SIZE], 
+	     int result[MP_SIZE])
+{
+    int MP1[MP_SIZE], MP2[MP_SIZE];
+
+    mpcmim(op1, MP1);
+    mpcmim(op2, MP2);
+    if (!mpeq(op1, MP1) || !mpeq(op2, MP2)) {
+	return -EINVAL;
+    }
+    
+    mpdiv(op1, op2, MP1);
+    mpcmim(MP1, MP1);
+    mpmul(MP1, op2, MP2);
+    mpsub(op1, MP2, result);
+    return 0;
+}
 
 void
 calc_percent(int s1[MP_SIZE], int s2[MP_SIZE], int t1[MP_SIZE])
Index: gcalctool/mpmath.h
===================================================================
RCS file: /cvs/gnome/gcalctool/gcalctool/mpmath.h,v
retrieving revision 1.7
diff -u -r1.7 mpmath.h
--- gcalctool/mpmath.h	7 Feb 2005 16:38:58 -0000	1.7
+++ gcalctool/mpmath.h	19 Sep 2005 14:24:08 -0000
@@ -49,6 +49,7 @@
 void do_zero(int t1[MP_SIZE]);
 void do_e(int t1[MP_SIZE]);
 void calc_xtimestenpowx(int s1[MP_SIZE], int s2[MP_SIZE], int t1[MP_SIZE]);
+int calc_modulus(int op1[MP_SIZE], int op2[MP_SIZE], int result[MP_SIZE]);
 void calc_ctrm(int t[MP_SIZE]);
 void calc_ddb(int t[MP_SIZE]);
 void calc_fv(int t[MP_SIZE]);
Index: gcalctool/syntax_translation.c
===================================================================
RCS file: /cvs/gnome/gcalctool/gcalctool/syntax_translation.c,v
retrieving revision 1.13
diff -u -r1.13 syntax_translation.c
--- gcalctool/syntax_translation.c	24 Aug 2005 15:12:20 -0000	1.13
+++ gcalctool/syntax_translation.c	19 Sep 2005 14:24:08 -0000
@@ -53,6 +53,7 @@
   { /* Integer part of a decimal number */       N_("int")   },
   { /* Natural logarithm */                      N_("ln")    },
   { /* Logarithm with 10 as a base number */     N_("log")   },
+  { /* Modulus */                                N_("mod")   },
   { /* Bitwise NOT */                            N_("not")   },
   { /* Bitwise OR */                             N_("or")    },
   { /* PI */                                     N_("pi")    },
