- int i, c;
-
- i = 0;
- do {
-
- /* Get next character */
- c = fgetc (stdin);
- if (c == -1) {
- /* Error or EOF */
- s [i] = 0;
- if (stdin->f_flags & _FERROR) {
- /* ERROR */
- return 0;
- } else {
- /* EOF */
- if (i) {
- return s;
- } else {
- return 0;
- }
- }
- }
-
- /* One char more */
- s [i++] = c;
-
- } while (c != '\n');
-
- /* Replace newline by NUL */
- s [i-1] = '\0';
+ register char* p = s;
+ int c;
+ unsigned i = 0;
+
+ while (1) {
+
+ /* Get next character */
+ if ((c = fgetc (stdin)) == EOF) {
+ /* Error or EOF */
+ *p = '\0';
+ if (stdin->f_flags & _FERROR) {
+ /* ERROR */
+ return 0;
+ } else {
+ /* EOF */
+ if (i) {
+ return s;
+ } else {
+ return 0;
+ }
+ }
+ }
+
+ /* One char more. Newline ends the input */
+ if ((char) c == '\n') {
+ *p = '\0';
+ break;
+ } else {
+ *p = c;
+ ++p;
+ ++i;
+ }
+
+ }