Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F141021488
D4230.id15732.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
10 KB
Referenced Files
None
Subscribers
None
D4230.id15732.diff
View Options
Index: sys/ddb/db_examine.c
===================================================================
--- sys/ddb/db_examine.c
+++ sys/ddb/db_examine.c
@@ -225,6 +225,10 @@
else
db_printf("\\%03o", (int)value);
break;
+ default:
+ db_print_format = 'x';
+ db_error("Syntax error: unsupported print modifier\n");
+ /*NOTREACHED*/
}
db_printf("\n");
}
Index: sys/ddb/db_expr.c
===================================================================
--- sys/ddb/db_expr.c
+++ sys/ddb/db_expr.c
@@ -43,6 +43,9 @@
static bool db_shift_expr(db_expr_t *valuep);
static bool db_term(db_expr_t *valuep);
static bool db_unary(db_expr_t *valuep);
+static bool db_logical_or_expr(db_expr_t *valuep);
+static bool db_logical_and_expr(db_expr_t *valuep);
+static bool db_logical_relation_expr(db_expr_t *valuep);
static bool
db_term(db_expr_t *valuep)
@@ -51,50 +54,50 @@
t = db_read_token();
if (t == tIDENT) {
- if (!db_value_of_name(db_tok_string, valuep) &&
- !db_value_of_name_pcpu(db_tok_string, valuep) &&
- !db_value_of_name_vnet(db_tok_string, valuep)) {
- db_error("Symbol not found\n");
- /*NOTREACHED*/
- }
- return (true);
+ if (!db_value_of_name(db_tok_string, valuep) &&
+ !db_value_of_name_pcpu(db_tok_string, valuep) &&
+ !db_value_of_name_vnet(db_tok_string, valuep)) {
+ db_error("Symbol not found\n");
+ /*NOTREACHED*/
+ }
+ return (true);
}
if (t == tNUMBER) {
- *valuep = (db_expr_t)db_tok_number;
- return (true);
+ *valuep = (db_expr_t)db_tok_number;
+ return (true);
}
if (t == tDOT) {
- *valuep = (db_expr_t)db_dot;
- return (true);
+ *valuep = (db_expr_t)db_dot;
+ return (true);
}
if (t == tDOTDOT) {
- *valuep = (db_expr_t)db_prev;
- return (true);
+ *valuep = (db_expr_t)db_prev;
+ return (true);
}
if (t == tPLUS) {
- *valuep = (db_expr_t) db_next;
- return (true);
+ *valuep = (db_expr_t) db_next;
+ return (true);
}
if (t == tDITTO) {
- *valuep = (db_expr_t)db_last_addr;
- return (true);
+ *valuep = (db_expr_t)db_last_addr;
+ return (true);
}
if (t == tDOLLAR) {
- if (!db_get_variable(valuep))
- return (false);
- return (true);
+ if (!db_get_variable(valuep))
+ return (false);
+ return (true);
}
if (t == tLPAREN) {
- if (!db_expression(valuep)) {
- db_error("Syntax error\n");
- /*NOTREACHED*/
- }
- t = db_read_token();
- if (t != tRPAREN) {
- db_error("Syntax error\n");
- /*NOTREACHED*/
- }
- return (true);
+ if (!db_expression(valuep)) {
+ db_error("Unmatched ()s\n");
+ /*NOTREACHED*/
+ }
+ t = db_read_token();
+ if (t != tRPAREN) {
+ db_error("Syntax error\n");
+ /*NOTREACHED*/
+ }
+ return (true);
}
db_unread_token(t);
return (false);
@@ -107,21 +110,37 @@
t = db_read_token();
if (t == tMINUS) {
- if (!db_unary(valuep)) {
- db_error("Syntax error\n");
- /*NOTREACHED*/
- }
- *valuep = -*valuep;
- return (true);
+ if (!db_unary(valuep)) {
+ db_error("Expression syntax error after '-'\n");
+ /*NOTREACHED*/
+ }
+ *valuep = -*valuep;
+ return (true);
+ }
+ if (t == tEXCL) {
+ if(!db_unary(valuep)) {
+ db_error("Expression syntax error after '!'\n");
+ /* NOTREACHED */
+ }
+ *valuep = (!(*valuep));
+ return (true);
+ }
+ if (t == tBIT_NOT) {
+ if(!db_unary(valuep)) {
+ db_error("Expression syntax error after '~'\n");
+ /* NOTREACHED */
+ }
+ *valuep = (~(*valuep));
+ return (true);
}
if (t == tSTAR) {
- /* indirection */
- if (!db_unary(valuep)) {
- db_error("Syntax error\n");
- /*NOTREACHED*/
- }
- *valuep = db_get_value((db_addr_t)*valuep, sizeof(void *), false);
- return (true);
+ /* indirection */
+ if (!db_unary(valuep)) {
+ db_error("Expression syntax error after '*'\n");
+ /*NOTREACHED*/
+ }
+ *valuep = db_get_value((db_addr_t)*valuep, sizeof(void *), false);
+ return (true);
}
db_unread_token(t);
return (db_term(valuep));
@@ -137,26 +156,32 @@
return (false);
t = db_read_token();
- while (t == tSTAR || t == tSLASH || t == tPCT || t == tHASH) {
- if (!db_term(&rhs)) {
- db_error("Syntax error\n");
- /*NOTREACHED*/
- }
- if (t == tSTAR)
- lhs *= rhs;
- else {
- if (rhs == 0) {
- db_error("Divide by 0\n");
- /*NOTREACHED*/
+ while (t == tSTAR || t == tSLASH || t == tPCT || t == tHASH ||
+ t == tBIT_AND ) {
+ if (!db_term(&rhs)) {
+ db_error("Syntax error\n");
+ /*NOTREACHED*/
+ }
+ switch(t) {
+ case tSTAR:
+ lhs *= rhs;
+ break;
+ case tBIT_AND:
+ lhs &= rhs;
+ break;
+ default:
+ if (rhs == 0) {
+ db_error("Divide by 0\n");
+ /*NOTREACHED*/
+ }
+ if (t == tSLASH)
+ lhs /= rhs;
+ else if (t == tPCT)
+ lhs %= rhs;
+ else
+ lhs = roundup(lhs, rhs);
}
- if (t == tSLASH)
- lhs /= rhs;
- else if (t == tPCT)
- lhs %= rhs;
- else
- lhs = roundup(lhs, rhs);
- }
- t = db_read_token();
+ t = db_read_token();
}
db_unread_token(t);
*valuep = lhs;
@@ -168,21 +193,31 @@
{
db_expr_t lhs, rhs;
int t;
+ char c;
if (!db_mult_expr(&lhs))
return (false);
t = db_read_token();
- while (t == tPLUS || t == tMINUS) {
- if (!db_mult_expr(&rhs)) {
- db_error("Syntax error\n");
- /*NOTREACHED*/
- }
- if (t == tPLUS)
- lhs += rhs;
- else
- lhs -= rhs;
- t = db_read_token();
+ while (t == tPLUS || t == tMINUS || t == tBIT_OR) {
+ if (!db_mult_expr(&rhs)) {
+ c = db_tok_string[0];
+ db_printf("Expression syntax error after '%c'\n",c);
+ db_error(NULL);
+ /*NOTREACHED*/
+ }
+ switch (t) {
+ case tPLUS:
+ lhs += rhs;
+ break;
+ case tMINUS:
+ lhs -= rhs;
+ break;
+ case tBIT_OR:
+ lhs |= rhs;
+ break;
+ }
+ t = db_read_token();
}
db_unread_token(t);
*valuep = lhs;
@@ -196,24 +231,96 @@
int t;
if (!db_add_expr(&lhs))
+ return (false);
+ t = db_read_token();
+ while (t == tSHIFT_L || t == tSHIFT_R) {
+ if (!db_add_expr(&rhs)) {
+ db_error("Syntax error\n");
+ /*NOTREACHED*/
+ }
+ if (rhs < 0) {
+ db_error("Negative shift amount\n");
+ /*NOTREACHED*/
+ }
+ if (t == tSHIFT_L)
+ lhs <<= rhs;
+ else {
+ /* Shift right is unsigned */
+ lhs = (unsigned) lhs >> rhs;
+ }
+ t = db_read_token();
+ }
+ db_unread_token(t);
+ *valuep = lhs;
+ return (true);
+}
+
+static bool
+db_logical_relation_expr(
+ db_expr_t *valuep)
+{
+ db_expr_t lhs, rhs;
+ int t;
+ char op[3];
+
+ if (!db_shift_expr(&lhs))
return (false);
t = db_read_token();
- while (t == tSHIFT_L || t == tSHIFT_R) {
- if (!db_add_expr(&rhs)) {
- db_error("Syntax error\n");
- /*NOTREACHED*/
- }
- if (rhs < 0) {
- db_error("Negative shift amount\n");
+ while (t == tLOG_EQ || t == tLOG_NOT_EQ || t == tGREATER ||
+ t == tGREATER_EQ || t == tLESS || t == tLESS_EQ) {
+ op[0] = db_tok_string[0];
+ op[1] = db_tok_string[1];
+ op[2] = 0;
+ if (!db_shift_expr(&rhs)) {
+ db_printf("Expression syntax error after \"%s\"\n", op);
+ db_error(NULL);
+ /*NOTREACHED*/
+ }
+ switch(t) {
+ case tLOG_EQ:
+ lhs = (lhs == rhs);
+ break;
+ case tLOG_NOT_EQ:
+ lhs = (lhs != rhs);
+ break;
+ case tGREATER:
+ lhs = (lhs > rhs);
+ break;
+ case tGREATER_EQ:
+ lhs = (lhs >= rhs);
+ break;
+ case tLESS:
+ lhs = (lhs < rhs);
+ break;
+ case tLESS_EQ:
+ lhs = (lhs <= rhs);
+ break;
+ }
+ t = db_read_token();
+ }
+ db_unread_token(t);
+ *valuep = lhs;
+ return (true);
+}
+
+static bool
+db_logical_and_expr(
+ db_expr_t *valuep)
+{
+ db_expr_t lhs, rhs;
+ int t;
+
+ if (!db_logical_relation_expr(&lhs))
+ return (false);
+
+ t = db_read_token();
+ while (t == tLOG_AND) {
+ if (!db_logical_relation_expr(&rhs)) {
+ db_error("Expression syntax error after \"&&\"\n");
/*NOTREACHED*/
}
- if (t == tSHIFT_L)
- lhs <<= rhs;
- else {
- /* Shift right is unsigned */
- lhs = (unsigned) lhs >> rhs;
- }
+ lhs = (lhs && rhs);
t = db_read_token();
}
db_unread_token(t);
@@ -221,8 +328,32 @@
return (true);
}
+static bool
+db_logical_or_expr(
+ db_expr_t *valuep)
+{
+ db_expr_t lhs, rhs;
+ int t;
+
+ if (!db_logical_and_expr(&lhs))
+ return(false);
+
+ t = db_read_token();
+ while (t == tLOG_OR) {
+ if (!db_logical_and_expr(&rhs)) {
+ db_error("Expression syntax error after \"||\"\n");
+ /*NOTREACHED*/
+ }
+ lhs = (lhs || rhs);
+ t = db_read_token();
+ }
+ db_unread_token(t);
+ *valuep = lhs;
+ return (true);
+}
+
int
db_expression(db_expr_t *valuep)
{
- return (db_shift_expr(valuep));
+ return (db_logical_or_expr(valuep));
}
Index: sys/ddb/db_lex.h
===================================================================
--- sys/ddb/db_lex.h
+++ sys/ddb/db_lex.h
@@ -36,12 +36,12 @@
/*
* Lexical analyzer.
*/
-void db_flush_lex(void);
+void db_flush_lex(void);
char *db_get_line(void);
-void db_inject_line(const char *command);
-int db_read_line(void);
-int db_read_token(void);
-void db_unread_token(int t);
+void db_inject_line(const char *command);
+int db_read_line(void);
+int db_read_token(void);
+void db_unread_token(int t);
extern db_expr_t db_tok_number;
#define TOK_STRING_SIZE 120
@@ -69,5 +69,18 @@
#define tSHIFT_R 19
#define tDOTDOT 20
#define tSEMI 21
+#define tLOG_EQ 22
+#define tLOG_NOT_EQ 23
+#define tLESS 24
+#define tLESS_EQ 25
+#define tGREATER 26
+#define tGREATER_EQ 27
+#define tBIT_AND 28
+#define tBIT_OR 29
+#define tLOG_AND 30
+#define tLOG_OR 31
+#define tSTRING 32
+#define tQUESTION 33
+#define tBIT_NOT 34
#endif /* !_DDB_DB_LEX_H_ */
Index: sys/ddb/db_lex.c
===================================================================
--- sys/ddb/db_lex.c
+++ sys/ddb/db_lex.c
@@ -274,6 +274,10 @@
case '/':
return (tSLASH);
case '=':
+ c = db_read_char();
+ if (c == '=')
+ return (tLOG_EQ);
+ db_unread_char(c);
return (tEQ);
case '%':
return (tPCT);
@@ -290,21 +294,46 @@
case '$':
return (tDOLLAR);
case '!':
+ c = db_read_char();
+ if (c == '='){
+ return (tLOG_NOT_EQ);
+ }
+ db_unread_char(c);
return (tEXCL);
case ';':
return (tSEMI);
+ case '&':
+ c = db_read_char();
+ if (c == '&')
+ return (tLOG_AND);
+ db_unread_char(c);
+ return (tBIT_AND);
+ case '|':
+ c=db_read_char();
+ if (c == '|')
+ return (tLOG_OR);
+ db_unread_char(c);
+ return (tBIT_OR);
case '<':
c = db_read_char();
if (c == '<')
return (tSHIFT_L);
+ if (c == '=')
+ return (tLESS_EQ);
db_unread_char(c);
- break;
+ return (tLESS);
case '>':
c = db_read_char();
if (c == '>')
return (tSHIFT_R);
+ if (c == '=')
+ return (tGREATER_EQ);
db_unread_char(c);
- break;
+ return (tGREATER);
+ case '?':
+ return (tQUESTION);
+ case '~':
+ return (tBIT_NOT);
case -1:
return (tEOF);
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Dec 31, 8:51 PM (18 h, 34 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27421127
Default Alt Text
D4230.id15732.diff (10 KB)
Attached To
Mode
D4230: DDB operators patch
Attached
Detach File
Event Timeline
Log In to Comment