summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--bin/man1/order.16
-rw-r--r--bin/order.y10
2 files changed, 11 insertions, 5 deletions
diff --git a/bin/man1/order.1 b/bin/man1/order.1
index 696a24d1..5a01ab4b 100644
--- a/bin/man1/order.1
+++ b/bin/man1/order.1
@@ -29,6 +29,6 @@ $ order 'a & b << 1'
 .Sh CAVEATS
 .Nm
 does not support the
-.Sy (type) ,
-.Sy sizeof
-or assignment operators.
+.Sy (type)
+operator
+or the assignment operators.
diff --git a/bin/order.y b/bin/order.y
index 84fcc2cc..4327c00a 100644
--- a/bin/order.y
+++ b/bin/order.y
@@ -21,6 +21,7 @@
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <sysexits.h>
 
 static void yyerror(const char *str) {
@@ -43,7 +44,7 @@ static int yylex(void);
 
 %}
 
-%token Var Arr Inc Dec Shl Shr Le Ge Eq Ne And Or
+%token Var Arr Inc Dec Sizeof Shl Shr Le Ge Eq Ne And Or
 
 %left ','
 %right '?' ':'
@@ -57,7 +58,7 @@ static int yylex(void);
 %left Shl Shr
 %left '+' '-'
 %left '*' '/' '%'
-%right '!' '~' Inc Dec
+%right '!' '~' Inc Dec Sizeof
 %left '[' ']' Arr '.'
 
 %%
@@ -81,6 +82,7 @@ expr:
 	| '-' expr { $$ = fmt("(-%s)", $2); }
 	| '*' expr { $$ = fmt("(*%s)", $2); }
 	| '&' expr { $$ = fmt("(&%s)", $2); }
+	| Sizeof expr { $$ = fmt("(sizeof %s)", $2); }
 	| expr '*' expr { $$ = fmt("(%s * %s)", $1, $3); }
 	| expr '/' expr { $$ = fmt("(%s / %s)", $1, $3); }
 	| expr '%' expr { $$ = fmt("(%s %% %s)", $1, $3); }
@@ -116,6 +118,10 @@ static int yylex(void) {
 	int len;
 	for (len = 0; isalnum(input[len]) || input[len] == '_'; ++len);
 	if (len) {
+		if (!strncmp(input, "sizeof", len)) {
+			input += len;
+			return Sizeof;
+		}
 		yylval = fmt("%.*s", len, input);
 		input += len;
 		return Var;