Done deputizing
authorZach Anderson <zra@zra-intrepid.(none)>
Fri, 21 Aug 2009 21:09:20 +0000 (14:09 -0700)
committerZach Anderson <zra@zra-intrepid.(none)>
Fri, 21 Aug 2009 21:09:20 +0000 (14:09 -0700)
26 files changed:
kern/include/string.h
kern/src/string.c
kern/src/testing.c
user/apps/roslib/measurements.c
user/apps/roslib/print_tests.c
user/parlib/inc/debug.h
user/parlib/src/debug.c
user/parlib/src/debugfmt.c
user/parlib/src/i386/syscall.c
user/parlib/src/parlibmain.c
user/parlib/src/syscall.c
user/roslib/inc/lib.h
user/roslib/inc/pool.h
user/roslib/inc/stdio.h
user/roslib/inc/string.h
user/roslib/src/Makefrag
user/roslib/src/asynccall.c
user/roslib/src/i386/entry.S
user/roslib/src/i386/syscall.c
user/roslib/src/libmain.c
user/roslib/src/printf.c
user/roslib/src/printfmt.c
user/roslib/src/readline.c
user/roslib/src/string.c
user/roslib/src/syscall.c
user/roslib/src/syswrapper.c

index fc15ae9..dd42c41 100644 (file)
@@ -8,7 +8,7 @@
 
 int    strlen(const STRING s);
 int    strnlen(const STRBUF(size) s, size_t size);
-/* zra : These being used, and they are dangerous, so I'm rm'ing them
+/* zra : These aren't being used, and they are dangerous, so I'm rm'ing them
 STRING strcpy(STRING dst, const STRING src);
 STRING strcat(STRING dst, const STRING src);
 */
index 005568f..e73f98f 100644 (file)
@@ -255,7 +255,7 @@ memcmp(const void *COUNT(n) v1, const void *COUNT(n) v2, size_t n)
 }
 
 void *
-memfind(const void *_s, int c, size_t n)
+memfind(const void *COUNT(n) _s, int c, size_t n)
 {
        const void *SNT ends = (const char *) _s + n;
        const void *BND(_s,_s + n) s = _s;
index 1f01de7..1b79796 100644 (file)
@@ -1,6 +1,3 @@
-#ifdef __DEPUTY__
-//#pragma nodeputy
-#endif
 
 #include <arch/mmu.h>
 #include <arch/arch.h>
index 38a9d2a..af17789 100644 (file)
@@ -8,10 +8,6 @@
 #include <syswrapper.h>
 #include <atomic.h>
 
-#ifdef __DEPUTY__
-#pragma nodeputy
-#endif
-
 /* System-Global shared page */
 #define shared_page UGDATA
 
@@ -20,8 +16,9 @@
  * - Second is some job info in here too.
  */
 
-barrier_t* bar = (barrier_t*)shared_page;
-volatile uint32_t* job_to_run = (uint32_t*)(shared_page + sizeof(barrier_t));
+barrier_t*COUNT(1) bar = (barrier_t*COUNT(1))TC(shared_page);
+volatile uint32_t*COUNT(1) job_to_run =
+    (uint32_t*COUNT(1))TC(shared_page + sizeof(barrier_t));
 
 // Experiment constants
 uint32_t corecount = 0;
@@ -127,7 +124,7 @@ void buster_async_wrapper(uint32_t iters, uint32_t num_writes, uint32_t flags)
        waiton_async_call(&desc1, &rsp1);
 }
 
-void buster_thruput_sync(uint32_t flags, char* text)
+void buster_thruput_sync(uint32_t flags, char*NTS text)
 {
        uint64_t thruput_ticks = 0;;    
        for (int i = 1; i < MAX_CACHELINE_WRITES; i= i*2) {
@@ -142,7 +139,7 @@ void buster_thruput_sync(uint32_t flags, char* text)
        }
 }
 
-void buster_thruput_async(uint32_t flags, char* text)
+void buster_thruput_async(uint32_t flags, char*NTS text)
 {
        uint64_t thruput_ticks = 0;;    
        for (int i = 1; i < MAX_CACHELINE_WRITES; i= i*2) {
@@ -156,7 +153,7 @@ void buster_thruput_async(uint32_t flags, char* text)
        }
 }
 
-void buster_latency_sync(uint32_t flags, char* text) 
+void buster_latency_sync(uint32_t flags, char*NTS text) 
 {
        uint64_t tick;
        for (int i = 1; i < MAX_CACHELINE_WRITES; i=i*2) { // 1 - 128
@@ -166,7 +163,7 @@ void buster_latency_sync(uint32_t flags, char* text)
        }
 }
 
-void buster_latency_async(uint32_t flags, char* text) 
+void buster_latency_async(uint32_t flags, char*NTS text) 
 {
        uint64_t tick;
        for (int i = 1; i < MAX_CACHELINE_WRITES; i=i*2) { // 1 - 128
index 79fb480..e3ea960 100644 (file)
@@ -1,10 +1,6 @@
 #include <inc/lib.h>
 #include <inc/syswrapper.h>
 
-#ifdef __DEPUTY__
-#pragma nodeputy
-#endif
-
 int main(int argc, char** argv)
 {
        int pid = sys_getpid();
index 801a706..c967525 100644 (file)
@@ -10,13 +10,18 @@ typedef void * TRUSTED va_list;
     ((ap) = (va_list)&(last) + __va_size(last))
 
 #define va_arg(ap, type) \
-    (*(type *)((ap) += __va_size(type), (ap) - __va_size(type)))
+    (*(type *COUNT(1))((ap) += __va_size(type), (ap) - __va_size(type)))
 
 #define va_end(ap)  ((void)0)
 
-size_t strnlen(const char *s, size_t size);
+size_t strnlen(const char *NTS s, size_t size);
+#ifdef __DEPUTY__
+void debugfmt(void (*putch)(int, TV(t)), TV(t) putdat, const char *NTS fmt, ...);
+void vdebugfmt(void (*putch)(int, TV(t)), TV(t) putdat, const char *NTS fmt, va_list);
+#else
 void debugfmt(void (*putch)(int, void**), void **putdat, const char *NTS fmt, ...);
 void vdebugfmt(void (*putch)(int, void**), void **putdat, const char *NTS fmt, va_list);
+#endif
 
 int    debug(const char * NTS fmt, ...);
 int    vdebug(const char * NTS fmt, va_list);
index 534faf1..39739af 100644 (file)
@@ -4,9 +4,6 @@
 // cprintf is a debugging statement, not a generic output statement.
 // It is very important that it always go to the console, especially when
 // debugging file descriptor code!
-#ifdef __DEPUTY__
-#pragma nodeputy
-#endif
 
 #include <arch/types.h>
 #include <parlib.h>
@@ -38,11 +35,11 @@ static void putch(int ch, debugbuf_t **b)
 int vdebug(const char *fmt, va_list ap)
 {
        debugbuf_t b;
-       debugbuf_t *bp = &b;
+       debugbuf_t *COUNT(1) bp = &b;
 
        b.idx = 0;
        b.cnt = 0;
-       vdebugfmt((void*)putch, (void**)&bp, fmt, ap);
+       vdebugfmt(putch, &bp, fmt, ap);
        sys_cputs(b.buf, b.idx);
 
        return b.cnt;
index a71b839..9dfa3d6 100644 (file)
@@ -1,7 +1,3 @@
-#ifdef __DEPUTY__
-#pragma nodeputy
-#endif
-
 #include <arch/types.h>
 #include <ros/error.h>
 #include <debug.h>
@@ -10,8 +6,13 @@
  * Print a number (base <= 16) in reverse order,
  * using specified putch function and associated pointer putdat.
  */
+#ifdef __DEPUTY__
+static void printnum(void (*putch)(int, TV(t)), TV(t) putdat,
+                        unsigned long long num, unsigned base, int width, int padc)
+#else
 static void printnum(void (*putch)(int, void**), void **putdat,
                         unsigned long long num, unsigned base, int width, int padc)
+#endif
 {
        // first recursively print all preceding (more significant) digits
        if (num >= base) {
@@ -52,23 +53,32 @@ static long long getint(va_list *ap, int lflag)
 
 
 // Main function to format and print a string.
+#ifdef __DEPUTY__
+void debugfmt(void (*putch)(int, TV(t)), TV(t) putdat, const char *fmt, ...);
+void vdebugfmt(void (*putch)(int, TV(t)), TV(t) putdat, const char *fmt, va_list ap)
+#else
 void debugfmt(void (*putch)(int, void**), void **putdat, const char *fmt, ...);
 void vdebugfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_list ap)
+#endif
 {
-       register const char *p;
+       register const char *NTS p;
+       const char *NTS last_fmt;
        register int ch, err;
        unsigned long long num;
        int base, lflag, width, precision, altflag;
        char padc;
 
        while (1) {
-               while ((ch = *(unsigned char *) fmt++) != '%') {
+               while ((ch = *(unsigned char *) fmt) != '%') {
                        if (ch == '\0')
                                return;
+                       fmt++;
                        putch(ch, putdat);
                }
+               fmt++;
 
                // Process a %-escape sequence
+               last_fmt = fmt;
                padc = ' ';
                width = -1;
                precision = -1;
@@ -146,16 +156,19 @@ void vdebugfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_li
 
                // string
                case 's':
-                       if ((p = va_arg(ap, char *)) == NULL)
+                       if ((p = va_arg(ap, char *NT)) == NULL)
                                p = "(null)";
                        if (width > 0 && padc != '-')
                                for (width -= strnlen(p, precision); width > 0; width--)
                                        putch(padc, putdat);
-                       for (; (ch = *p++) != '\0' && (precision < 0 || --precision >= 0); width--)
+                       for (; (ch = *p) != '\0' && (precision < 0 || --precision >= 0); width--) {
                                if (altflag && (ch < ' ' || ch > '~'))
                                        putch('?', putdat);
                                else
                                        putch(ch, putdat);
+                               // zra: make sure *p isn't '\0' before inc'ing
+                               p++;
+                       }
                        for (; width > 0; width--)
                                putch(' ', putdat);
                        break;
@@ -208,14 +221,19 @@ void vdebugfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_li
                // unrecognized escape sequence - just print it literally
                default:
                        putch('%', putdat);
-                       for (fmt--; fmt[-1] != '%'; fmt--)
+                       fmt = last_fmt;
+                       //for (fmt--; fmt[-1] != '%'; fmt--)
                                /* do nothing */;
                        break;
                }
        }
 }
 
+#ifdef __DEPUTY__
+void debugfmt(void (*putch)(int, TV(t)), TV(t) putdat, const char *fmt, ...)
+#else
 void debugfmt(void (*putch)(int, void**), void **putdat, const char *fmt, ...)
+#endif
 {
        va_list ap;
 
index d4ef7ab..d8e0024 100644 (file)
@@ -1,7 +1,4 @@
 // System call stubs.
-#ifdef __DEPUTY__
-#pragma nodeputy
-#endif
 
 #include <arch/types.h>
 #include <arch/arch.h>
index c28a593..992d32b 100644 (file)
@@ -1,16 +1,13 @@
 // Called from entry.S to get us going.
-#ifdef __DEPUTY__
-#pragma nodeputy
-#endif
 
 #include <parlib.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <debug.h>
 
-extern int main(int argc, char **argv);
+extern int main(int argc, char * NTS * COUNT(argc) NT argv);
 
-void parlibmain(int argc, char **argv)
+void parlibmain(int argc, char * NTS * COUNT(argc) NT argv)
 {
        debug("Hello from process %d!\n", getpid());
        // call user main routine
index cbe5fca..05142dd 100644 (file)
@@ -1,7 +1,4 @@
 // System call stubs.
-#ifdef __DEPUTY__
-#pragma nodeputy
-#endif
 
 #include <parlib.h>
 
index a758e15..3ad82a2 100644 (file)
@@ -22,7 +22,7 @@
 #define USED(x)                (void)(x)
 
 // libos.c or entry.S
-extern char *binaryname;
+extern char *NTS binaryname;
 extern procinfo_t* procinfo;
 extern procdata_t* procdata;
 extern syscall_front_ring_t syscallfrontring;
@@ -66,7 +66,7 @@ void        sys_yield(void);
 int         sys_proc_create(char* path);
 error_t     sys_proc_run(int pid);
 /* Generic Async Call */
-error_t     waiton_syscall(syscall_desc_t* desc, syscall_rsp_t* rsp);
+error_t     waiton_syscall(syscall_desc_t* desc, syscall_rsp_t*COUNT(1) rsp);
 
 // async callback
 #define MAX_SYSCALLS 100
@@ -87,7 +87,7 @@ typedef struct async_rsp_t {
 
 // This is per-thread, and used when entering a async library call to properly
 // group syscall_desc_t used during the processing of that async call
-extern async_desc_t* current_async_desc;
+extern async_desc_t*COUNT(1) current_async_desc;
 
 // This pooltype contains syscall_desc_t, which is how you wait on one syscall.
 POOL_TYPE_DEFINE(syscall_desc_t, syscall_desc_pool, MAX_SYSCALLS);
@@ -101,8 +101,8 @@ extern syscall_desc_pool_t syscall_desc_pool;
 extern async_desc_pool_t async_desc_pool;
 extern timer_pool_t timer_pool;
 
-error_t waiton_async_call(async_desc_t* desc, async_rsp_t* rsp);
-async_desc_t* get_async_desc(void);
+error_t waiton_async_call(async_desc_t*COUNT(1) desc, async_rsp_t* rsp);
+async_desc_t*COUNT(1) get_async_desc(void);
 syscall_desc_t* get_sys_desc(async_desc_t* desc);
 error_t get_all_desc(async_desc_t** a_desc, syscall_desc_t** s_desc);
 
index 254d224..948fbe8 100644 (file)
@@ -11,7 +11,7 @@ typedef struct struct_##p {
        uint32_t size;                                                         \
        uint32_t free;                                                         \
        uint32_t index;                                                        \
-       _type* queue[(sz)];                                                       \
+       _type*COUNT(1) queue[(sz)];                                                       \
        _type pool[(sz)];                                                         \
 } p##_t;
 
index d82ecaa..345a7ad 100644 (file)
@@ -20,22 +20,27 @@ int  getchar(void);
 int     iscons(int fd);
 
 // lib/printfmt.c
+
+#ifdef __DEPUTY__
+void   printfmt(void (*putch)(int, TV(t)), TV(t) putdat, const char *NTS fmt, ...);
+void   vprintfmt(void (*putch)(int, TV(t)), TV(t) putdat, const char *NTS fmt, va_list);
+#else
 void   printfmt(void (*putch)(int, void**), void **putdat, const char *NTS fmt, ...);
-//void vprintfmt(void (*putch)(int, TV(t)), TV(t) putdat, const char *NTS fmt, va_list);
 void   vprintfmt(void (*putch)(int, void**), void **putdat, const char *NTS fmt, va_list);
+#endif
 
 // lib/printf.c
 int    cprintf(const char * NTS fmt, ...);
 int    vcprintf(const char * NTS fmt, va_list);
 
 // lib/sprintf.c
-int    snprintf(char *str, int size, const char *fmt, ...);
-int    vsnprintf(char *COUNT(size) str, int size, const char *fmt, va_list);
+int    snprintf(char *COUNT(size) str, int size, const char *NTS fmt, ...);
+int    vsnprintf(char *COUNT(size) str, int size, const char *NTS fmt, va_list);
 
 // lib/fprintf.c
-int    printf(const char *fmt, ...);
-int    fprintf(int fd, const char *fmt, ...);
-int    vfprintf(int fd, const char *fmt, va_list);
+int    printf(const char *NTS fmt, ...);
+int    fprintf(int fd, const char *NTS fmt, ...);
+int    vfprintf(int fd, const char *NTS fmt, va_list);
 
 // lib/readline.c
 char *NTS readline(const char *NTS prompt);
index 53aefea..1ab1770 100644 (file)
@@ -3,22 +3,30 @@
 
 #include <types.h>
 
-int    strlen(const char *s);
-int    strnlen(const char *s, size_t size);
+#define STRING char *NTS
+#define STRBUF(n) char *NT COUNT(n)
+
+int    strlen(const STRING s);
+int    strnlen(const STRBUF(size) s, size_t size);
+
+/* zra: strcpy is dangerous. Let's not have it
 char * strcpy(char *dst, const char *src);
-char * strncpy(char *dst, const char *src, size_t size);
-size_t strlcpy(char *dst, const char *src, size_t size);
-int    strcmp(const char *s1, const char *s2);
-int    strncmp(const char *s1, const char *s2, size_t size);
-char * strchr(const char *s, char c);
-char * strfind(const char *s, char c);
-
-void * memset(void *dst, int c, size_t len);
-void * memcpy(void *dst, const void *src, size_t len);
-void * memmove(void *dst, const void *src, size_t len);
-int    memcmp(const void *s1, const void *s2, size_t len);
-void * memfind(const void *s, int c, size_t len);
-
-long   strtol(const char *s, char **endptr, int base);
+*/
+
+STRING strncpy(STRBUF(size) dst, const STRBUF(size) src, size_t size);
+size_t strlcpy(STRBUF(size - 1) dst, const STRING src, size_t size);
+int    strcmp(const STRING s1, const STRING s2);
+int    strncmp(const STRING s1, const STRING s2, size_t size);
+STRING strchr(const STRING s, char c);
+STRING strfind(const STRING s, char c);
+
+void * (DMEMSET(1, 2, 3) memset)(void* p, int what, size_t sz);
+int    (DMEMCMP(1, 2, 3) memcmp)(const void* s1, const void* s2, size_t sz);
+void * (DMEMCPY(1, 2, 3) memcpy)(void* dst, const void* src, size_t sz);
+void * (DMEMCPY(1, 2, 3) memmove)(void *dst, const void* src, size_t sz);
+
+void *BND(s,s+len)     memfind(const void *COUNT(len) s, int c, size_t len);
+
+long   strtol(const char *NTS s, char **endptr, int base);
 
 #endif /* not ROS_INC_STRING_H */
index 8e18fef..64227b3 100644 (file)
@@ -1,7 +1,7 @@
 USER_ROSLIB_SRC_DIR = $(USER_ROSLIB_DIR)/src
 OBJDIRS += $(USER_ROSLIB_SRC_DIR)
 
-USER_ROSLIB_SRC_CFLAGS   := $(USER_CFLAGS) \
+USER_ROSLIB_SRC_CFLAGS   := $(USER_CFLAGS) -g\
                             -I$(USER_ROSLIB_INCLUDE_DIR)
 
 USER_ROSLIB_SRC_SRCFILES := $(USER_ROSLIB_SRC_DIR)/console.c \
index 23a7a9b..2d6af76 100644 (file)
@@ -1,7 +1,3 @@
-#ifdef __DEPUTY__
-#pragma nodeputy
-#endif
-
 #include <lib.h>
 #include <ros/syscall.h>
 
index 2b94c7e..2f31fc5 100644 (file)
@@ -1,21 +1,23 @@
 #include <arch/mmu.h>
 #include <ros/memlayout.h>
 
-.data
+.section .data
 
 
 // Define the global symbols 'procinfo', 'procdata', 'pages', 'vpt', and 'vpd'
 // so that they can be used in C as if they were ordinary global arrays.
-       .globl procinfo
-       .set procinfo, UINFO
-       .globl procdata
-       .set procdata, UDATA
-       .globl pages
-       .set pages, UPAGES
-       .globl vpt
-       .set vpt, UVPT
-       .globl vpd
-       .set vpd, (UVPT+(UVPT>>12)*4)
+.globl procinfo
+procinfo:
+.long UINFO
+.globl procdata
+procdata:
+.long UDATA
+.globl vpt
+vpt:
+.long UVPT
+.globl vpd
+vpd:
+.long (UVPT+(UVPT>>12)*4)
 
 
 // Entrypoint - this is where the kernel (or our parent process)
index d4ef7ab..d8e0024 100644 (file)
@@ -1,7 +1,4 @@
 // System call stubs.
-#ifdef __DEPUTY__
-#pragma nodeputy
-#endif
 
 #include <arch/types.h>
 #include <arch/arch.h>
index 4b6c704..db5d508 100644 (file)
@@ -1,12 +1,12 @@
 // Called from entry.S to get us going.
-#ifdef __DEPUTY__
-#pragma nodeputy
-#endif
 
+#include <arch/mmu.h>
+#include <ros/memlayout.h>
 #include <lib.h>
+#include <stdio.h>
 #include <ros/syscall.h>
 
-extern int main(int argc, char **argv);
+extern int main(int argc, char *NTS*NT COUNT(argc) argv);
 
 char *binaryname = "(PROGRAM NAME UNKNOWN)";
 syscall_front_ring_t syscallfrontring;
@@ -18,7 +18,7 @@ timer_pool_t timer_pool;
 // This is meant to be PER USER THREAD!!! (TODO (benh))
 async_desc_t* current_async_desc;
 
-void libmain(int argc, char **argv)
+void libmain(int argc, char * NTS * NT COUNT(argc) argv)
 {
        // Set up the front ring for the general syscall ring
        // and the back ring for the general sysevent ring
index ea36552..0ad7618 100644 (file)
@@ -4,9 +4,6 @@
 // cprintf is a debugging statement, not a generic output statement.
 // It is very important that it always go to the console, especially when
 // debugging file descriptor code!
-#ifdef __DEPUTY__
-#pragma nodeputy
-#endif
 
 #include <types.h>
 #include <stdio.h>
@@ -40,11 +37,11 @@ static void putch(int ch, printbuf_t **b)
 int vcprintf(const char *fmt, va_list ap)
 {
        printbuf_t b;
-       printbuf_t *bp = &b;
+       printbuf_t *COUNT(1) bp = &b;
 
        b.idx = 0;
        b.cnt = 0;
-       vprintfmt((void*)putch, (void**)&bp, fmt, ap);
+       vprintfmt(putch, &bp, fmt, ap);
        sys_cputs(b.buf, b.idx);
 
        return b.cnt;
@@ -99,14 +96,14 @@ static void putch_async(int ch, printbuf_t **b)
        (*b)->cnt++; // supposed to be overall number, not just in one buffer
 }
 
-static int vcprintf_async(const char *fmt, va_list ap)
+static int vcprintf_async(const char *NTS fmt, va_list ap)
 {
        // start with an available buffer.  TODO: check return value
        printbuf_t* b = get_free_buffer();
 
        b->idx = 0;
        b->cnt = 0;
-       vprintfmt((void*)putch_async, (void**)&b, fmt, ap);
+       vprintfmt(putch_async, &b, fmt, ap);
        // TODO - should check for a return value for sys_
        sys_cputs_async(b->buf, b->idx, get_sys_desc(current_async_desc),
                        cputs_async_cleanup, b);
index 911ae11..066dda5 100644 (file)
@@ -2,10 +2,6 @@
 // used in common by printf, sprintf, fprintf, etc.
 // This code is also used by both the kernel and user programs.
 
-#ifdef __DEPUTY__
-#pragma nodeputy
-#endif
-
 #include <ros/error.h>
 #include <types.h>
 #include <stdio.h>
  * Print a number (base <= 16) in reverse order,
  * using specified putch function and associated pointer putdat.
  */
+#ifdef __DEPUTY__
+static void printnum(void (*putch)(int, TV(t)), TV(t) putdat,
+                        unsigned long long num, unsigned base, int width, int padc)
+#else
 static void printnum(void (*putch)(int, void**), void **putdat,
                         unsigned long long num, unsigned base, int width, int padc)
+#endif
 {
        // first recursively print all preceding (more significant) digits
        if (num >= base) {
@@ -58,24 +59,32 @@ static long long getint(va_list *ap, int lflag)
 
 
 // Main function to format and print a string.
+#ifdef __DEPUTY__
+void printfmt(void (*putch)(int, TV(t)), TV(t) putdat, const char *fmt, ...);
+void vprintfmt(void (*putch)(int, TV(t)), TV(t) putdat, const char *fmt, va_list ap)
+#else
 void printfmt(void (*putch)(int, void**), void **putdat, const char *fmt, ...);
-
 void vprintfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_list ap)
+#endif
 {
-       register const char *p;
+       register const char *NTS p;
+       const char *NTS last_fmt;
        register int ch, err;
        unsigned long long num;
        int base, lflag, width, precision, altflag;
        char padc;
 
        while (1) {
-               while ((ch = *(unsigned char *) fmt++) != '%') {
+               while ((ch = *(unsigned char *) fmt) != '%') {
                        if (ch == '\0')
                                return;
+                       fmt++;
                        putch(ch, putdat);
                }
+               fmt++;
 
                // Process a %-escape sequence
+               last_fmt = fmt;
                padc = ' ';
                width = -1;
                precision = -1;
@@ -153,16 +162,19 @@ void vprintfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_li
 
                // string
                case 's':
-                       if ((p = va_arg(ap, char *)) == NULL)
+                       if ((p = va_arg(ap, char *NT)) == NULL)
                                p = "(null)";
                        if (width > 0 && padc != '-')
                                for (width -= strnlen(p, precision); width > 0; width--)
                                        putch(padc, putdat);
-                       for (; (ch = *p++) != '\0' && (precision < 0 || --precision >= 0); width--)
+                       for (; (ch = *p) != '\0' && (precision < 0 || --precision >= 0); width--) {
                                if (altflag && (ch < ' ' || ch > '~'))
                                        putch('?', putdat);
                                else
                                        putch(ch, putdat);
+                               // zra: make sure *p isn't '\0' before inc'in
+                               p++;
+                       }
                        for (; width > 0; width--)
                                putch(' ', putdat);
                        break;
@@ -215,14 +227,19 @@ void vprintfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_li
                // unrecognized escape sequence - just print it literally
                default:
                        putch('%', putdat);
-                       for (fmt--; fmt[-1] != '%'; fmt--)
+                       fmt = last_fmt;
+                       //for (fmt--; fmt[-1] != '%'; fmt--)
                                /* do nothing */;
                        break;
                }
        }
 }
 
+#ifdef __DEPUTY__
+void printfmt(void (*putch)(int, TV(t)), TV(t) putdat, const char *fmt, ...)
+#else
 void printfmt(void (*putch)(int, void**), void **putdat, const char *fmt, ...)
+#endif
 {
        va_list ap;
 
@@ -232,12 +249,12 @@ void printfmt(void (*putch)(int, void**), void **putdat, const char *fmt, ...)
 }
 
 typedef struct sprintbuf {
-       char *buf;
-       char *ebuf;
+       char *BND(__this,ebuf) buf;
+       char *SNT ebuf;
        int cnt;
 } sprintbuf_t;
 
-static void sprintputch(int ch, sprintbuf_t **b)
+static void sprintputch(int ch, sprintbuf_t *NONNULL *NONNULL b)
 {
        (*b)->cnt++;
        if ((*b)->buf < (*b)->ebuf)
@@ -246,14 +263,19 @@ static void sprintputch(int ch, sprintbuf_t **b)
 
 int vsnprintf(char *buf, int n, const char *fmt, va_list ap)
 {
-       sprintbuf_t b = {buf, buf+n-1, 0};
-       sprintbuf_t *bp = &b;
+       sprintbuf_t b;// = {buf, buf+n-1, 0};
+       sprintbuf_t *NONNULL COUNT(1) bp = &b;
 
        if (buf == NULL || n < 1)
                return -EINVAL;
 
+       b.buf = NULL; // zra : help out the Deputy optimizer a bit
+       b.ebuf = buf+n-1;
+       b.cnt = 0;
+       b.buf = buf;
+
        // print the string to the buffer
-       vprintfmt((void*)sprintputch, (void**)&bp, fmt, ap);
+       vprintfmt(sprintputch, (sprintbuf_t *NONNULL*NONNULL)&bp, fmt, ap);
 
        // null terminate the buffer
        *b.buf = '\0';
index 505f0cb..01832f8 100644 (file)
@@ -1,12 +1,8 @@
-#ifdef __DEPUTY__
-#pragma nodeputy
-#endif
-
 #include <ros/error.h>
 #include <stdio.h>
 
 #define BUFLEN 1024
-static char buf[BUFLEN];
+static char (NT buf)[BUFLEN];
 
 char *
 readline(const char *prompt)
index 06622a9..cc7d620 100644 (file)
@@ -1,9 +1,5 @@
 // Basic string routines.  Not hardware optimized, but not shabby.
 
-#ifdef __DEPUTY__
-#pragma nodeputy
-#endif
-
 #include <string.h>
 
 int
@@ -26,6 +22,8 @@ strnlen(const char *s, size_t size)
        return n;
 }
 
+#if 0
+// zra: strcpy should not be.
 char *
 strcpy(char *dst, const char *src)
 {
@@ -36,6 +34,7 @@ strcpy(char *dst, const char *src)
                /* do nothing */;
        return ret;
 }
+#endif
 
 char *
 strncpy(char *dst, const char *src, size_t size) {
@@ -109,10 +108,11 @@ strfind(const char *s, char c)
 
 
 void *
-memset(void *v, int c, size_t n)
+memset(void *COUNT(_n) v, int c, size_t _n)
 {
-       char *p;
+       char *BND(v,v+_n) p;
        int m;
+       size_t n = _n;
 
        p = v;
        m = n;
@@ -123,10 +123,11 @@ memset(void *v, int c, size_t n)
 }
 
 void *
-memcpy(void *dst, const void *src, size_t n)
+(DMEMCPY(1,2,3) memcpy)(void *COUNT(_n) dst, const void *COUNT(_n) src, size_t _n)
 {
-       const char *s;
-       char *d;
+       const char *BND(src,src+_n) s;
+       char *BND(dst,dst+_n) d;
+       size_t n = _n;
 
        s = src;
        d = dst;
@@ -137,10 +138,11 @@ memcpy(void *dst, const void *src, size_t n)
 }
 
 void *
-memmove(void *dst, const void *src, size_t n)
+memmove(void *COUNT(_n) dst, const void *COUNT(_n) src, size_t _n)
 {
-       const char *s;
-       char *d;
+       const char *BND(src,src+_n) s;
+       char *BND(dst,dst+_n) d;
+       size_t n = _n;
        
        s = src;
        d = dst;
@@ -157,10 +159,10 @@ memmove(void *dst, const void *src, size_t n)
 }
 
 int
-memcmp(const void *v1, const void *v2, size_t n)
+memcmp(const void *COUNT(n) v1, const void *COUNT(n) v2, size_t n)
 {
-       const uint8_t *s1 = (const uint8_t *) v1;
-       const uint8_t *s2 = (const uint8_t *) v2;
+       const uint8_t *BND(v1,v1+n) s1 = (const uint8_t *) v1;
+       const uint8_t *BND(v2,v2+n) s2 = (const uint8_t *) v2;
 
        while (n-- > 0) {
                if (*s1 != *s2)
@@ -172,13 +174,14 @@ memcmp(const void *v1, const void *v2, size_t n)
 }
 
 void *
-memfind(const void *s, int c, size_t n)
+memfind(const void *COUNT(n) _s, int c, size_t n)
 {
-       const void *ends = (const char *) s + n;
+       const void *SNT ends = (const char *) _s + n;
+       const void *BND(_s,_s + n) s = _s;
        for (; s < ends; s++)
                if (*(const unsigned char *) s == (unsigned char) c)
                        break;
-       return (void *) s;
+       return (void *BND(_s,_s + n)) s;
 }
 
 long
index f5beaff..d4457c7 100644 (file)
@@ -1,7 +1,4 @@
 // System call stubs.
-#ifdef __DEPUTY__
-#pragma nodeputy
-#endif
 
 #include <arch/types.h>
 #include <arch/arch.h>
@@ -12,7 +9,7 @@ intreg_t syscall(uint16_t num, intreg_t a1,
                 intreg_t a2, intreg_t a3,
                 intreg_t a4, intreg_t a5);
 
-static error_t async_syscall(syscall_req_t* req, syscall_desc_t* desc)
+static error_t async_syscall(syscall_req_t *COUNT(1) req, syscall_desc_t* desc)
 {
        // Note that this assumes one global frontring (TODO)
        // abort if there is no room for our request.  ring size is currently 64.
index 9d24e0c..baab955 100644 (file)
@@ -1,6 +1,3 @@
-#ifdef __DEPUTY__
-#pragma nodeputy
-#endif
 
 #include <types.h>
 #include <lib.h>