def Run(self, cmd_val): # type: (cmd_value__Argv) -> int attrs, arg_r = flag_spec.ParseCmdVal('read', cmd_val) arg = arg_types.read(attrs.attrs) names = arg_r.Rest() fd = self.stdin.fileno() if arg.t >= 0.0: if arg.t != 0.0: e_die("read -t isn't implemented (except t=0)") else: return 0 if pyos.InputAvailable(fd) else 1 bits = 0 if self.stdin.isatty(): bits |= pyos.TERM_ICANON if arg.s: # silent bits |= pyos.TERM_ECHO if arg.p is not None: # only if tty mylib.Stderr().write(arg.p) if bits == 0: status = self._Read(arg, names) else: term = pyos.TermState(fd, ~bits) try: status = self._Read(arg, names) finally: term.Restore() return status
def Run(self, cmd_val): # type: (cmd_value__Argv) -> int attrs, arg_r = flag_spec.ParseCmdVal('read', cmd_val) arg = arg_types.read(attrs.attrs) names = arg_r.Rest() # Don't respect any of the other options here? This is buffered I/O. if arg.line: # read --line var_name, var_spid = arg_r.Peek2() if var_name is None: var_name = '_line' else: if var_name.startswith(':'): # optional : sigil var_name = var_name[1:] arg_r.Next() next_arg, next_spid = arg_r.Peek2() if next_arg is not None: raise error.Usage('got extra argument', span_id=next_spid) return self._Line(arg, var_name) if arg.q: e_usage('--qsn can only be used with --line') if arg.all: # read --all var_name, var_spid = arg_r.Peek2() if var_name is None: var_name = '_all' else: if var_name.startswith(':'): # optional : sigil var_name = var_name[1:] arg_r.Next() next_arg, next_spid = arg_r.Peek2() if next_arg is not None: raise error.Usage('got extra argument', span_id=next_spid) return self._All(var_name) if arg.q: e_usage('--qsn not implemented yet') fd = self.stdin.fileno() if arg.t >= 0.0: if arg.t != 0.0: e_die("read -t isn't implemented (except t=0)") else: return 0 if pyos.InputAvailable(fd) else 1 bits = 0 if self.stdin.isatty(): bits |= pyos.TERM_ICANON if arg.s: # silent bits |= pyos.TERM_ECHO if arg.p is not None: # only if tty mylib.Stderr().write(arg.p) if bits == 0: status = self._Read(arg, names) else: term = pyos.TermState(fd, ~bits) try: status = self._Read(arg, names) finally: term.Restore() return status