Hi, Kapus Timotej wrote:
> @@ -488,8 +488,7 @@ ifetch (lin line, bool whichbuf, size_t *psize) > if (line == input_lines) > *psize = last_line_size; > else { > - for (q = p; *q++ != '\n'; ) > - /* do nothing */ ; > + q = rawmemchr(p,'\n') + 1; > *psize = q - p; > } > return p; This looks OK to me. But rawmemchr is not portable; therefore you would also need to import it from gnulib (a one-line addition in bootstrap.conf). > @@ -2348,14 +2343,12 @@ get_ed_command_letter (char const *line) > > if (ISDIGIT (*p)) > { > - while (ISDIGIT (*++p)) > - /* do nothing */ ; > + p += strspn(p + 1, "0123456789") + 1; > if (*p == ',') > { > if (! ISDIGIT (*++p)) > return 0; > - while (ISDIGIT (*++p)) > - /* do nothing */ ; > + p += strspn(p + 1, "0123456789") + 1; > pair = true; > } > } > @@ -2384,8 +2377,7 @@ get_ed_command_letter (char const *line) > return 0; > } > > - while (*p == ' ' || *p == '\t') > - p++; > + p += strspn(p, " \t"); > if (*p == '\n') > return letter; > return 0; I don't think this would improve maintainability. The reason is that these functions strspn, strcspn are not widely used enough, that every maintainer knows them by heart. Take me as an example: I have been coding GNU programs in C for 26 years. I even wrote the manual pages for wcsspn and wcscspn. And yet, I can still not remember what each of these functions actually does and what it returns in case of search failure. Whereas understanding a simple open-coded loop while (*p == ' ' || *p == '\t') p++; is done in 5 seconds, without requiring looking up any man page. And it's more extensible (in case another condition needs to be added in the loop later). Finally, regarding efficiency: As you already noted, strspn(p + 1, "0123456789") will compare each byte against '0', then against '1', then against '2', and so on - without the obvious optimizations that went into the ISDIGIT macro. Bruno