+gfmtset(tp, s)
+ register struct termios *tp;
+ char *s;
+{
+ register int cnt;
+ char sep;
+ char *saves = s;
+ int cval;
+#define advance(c) while (*(s) && *(s) != (c)) (s)++; if (*s) (s)++ ; \
+ else \
+ errexit("bad gfmt operand: %s", saves)
+#define chkeq(string) if (strncmp(s, (string), strlen(string))) \
+ errexit("bad gfmt operand: %s", saves)
+
+ if (s == NULL)
+ errexit("missing gfmt string");
+ advance(':');
+ chkeq("iflag=");
+ advance('=');
+ sscanf(s, "%x", &tp->c_iflag);
+
+ advance(':');
+ chkeq("oflag");
+ advance('=');
+ sscanf(s, "%x", &tp->c_oflag);
+
+ advance(':');
+ chkeq("cflag");
+ advance('=');
+ sscanf(s, "%x", &tp->c_cflag);
+
+ advance(':');
+ chkeq("lflag");
+ advance('=');
+ sscanf(s, "%x", &tp->c_lflag);
+
+ advance(':');
+ chkeq("cc=");
+
+ for (cnt = 0, sep = '='; cnt < NCCS; cnt++, sep = ',') {
+ advance(sep);
+ sscanf(s, "%o", &cval);
+ tp->c_cc[cnt] = cval;
+ }
+
+ advance(':');
+ chkeq("ispeed=");
+ advance('=');
+ sscanf(s, "%d", &tp->c_ispeed);
+
+ advance(':');
+ chkeq("ospeed=");
+ advance('=');
+ sscanf(s, "%d", &tp->c_ospeed);