separate getc/putc from fgetc/fputc
authorRich Felker <dalias@aerifal.cx>
Sat, 27 Oct 2012 23:52:40 +0000 (19:52 -0400)
committerRich Felker <dalias@aerifal.cx>
Sat, 27 Oct 2012 23:52:40 +0000 (19:52 -0400)
for conformance, two functions should not have the same address. a
conforming program could use the addresses of getc and fgetc in ways
that assume they are distinct. normally i would just use a wrapper,
but these functions are so small and performance-critical that an
extra layer of function call could make the one that's a wrapper
nearly twice as slow, so I'm just duplicating the code instead.

src/stdio/fgetc.c
src/stdio/fputc.c
src/stdio/getc.c [new file with mode: 0644]
src/stdio/putc.c [new file with mode: 0644]

index 65a10fa..e122416 100644 (file)
@@ -9,6 +9,3 @@ int fgetc(FILE *f)
        __unlockfile(f);
        return c;
 }
-
-weak_alias(fgetc, getc);
-weak_alias(fgetc, _IO_getc);
index 9953296..92762c9 100644 (file)
@@ -8,6 +8,3 @@ int fputc(int c, FILE *f)
        __unlockfile(f);
        return c;
 }
-
-weak_alias(fputc, putc);
-weak_alias(fputc, _IO_putc);
diff --git a/src/stdio/getc.c b/src/stdio/getc.c
new file mode 100644 (file)
index 0000000..b3f351d
--- /dev/null
@@ -0,0 +1,13 @@
+#include "stdio_impl.h"
+
+int getc(FILE *f)
+{
+       int c;
+       if (f->lock < 0 || !__lockfile(f))
+               return getc_unlocked(f);
+       c = getc_unlocked(f);
+       __unlockfile(f);
+       return c;
+}
+
+weak_alias(getc, _IO_getc);
diff --git a/src/stdio/putc.c b/src/stdio/putc.c
new file mode 100644 (file)
index 0000000..fa89349
--- /dev/null
@@ -0,0 +1,12 @@
+#include "stdio_impl.h"
+
+int putc(int c, FILE *f)
+{
+       if (f->lock < 0 || !__lockfile(f))
+               return putc_unlocked(c, f);
+       c = putc_unlocked(c, f);
+       __unlockfile(f);
+       return c;
+}
+
+weak_alias(putc, _IO_putc);