i think i might have used strstr. ok, i suppose you might have a file with 'does not exist' in its name, but i can't say i lose much sleep over it. could use strqstr to look outside quotes i suppose. also, in term% ls /sys/src/cm/db ls: /sys/src/cm/db: '/sys/src/cm/db' does not exist if it were ls: /sys/src/cm/db: file does not exist: '/sys/src/cm/db' i'd find it a little odd to read, myself, although again i can't get too worked up about it. in APE's case i suspect i'd settle for putting the most common error strings at the front, on the grounds that most applications stop processing once an error occurs anyhow, except for access/open/exec/stat when used to search for something. (so do the check for `does not exist' or `no permission' early.) is this worry the result of having profiled something important? i vaguely remember from my time fighting it that gcc's cpp causes the computer to wade through pages of filth to get anywhere when doing the search lists for #include but there's much more to slow you down in that thing. perhaps like Linus's scheduler someone has finally done the decent thing? anyhow: IS there a real cause to worry about APE's string -> errno translation speed based on (say) a profile of an application, or is it conjecture?