ref: a48838fc9da63959bc31acd61088d23494b6c105
parent: 64483f35745627ddb2e7d678a10a052aef38895e
author: qwx <qwx@sciops.net>
date: Sun Oct 16 02:40:33 EDT 2022
npe: add clock()
--- /dev/null
+++ b/npe-clock
@@ -1,0 +1,158 @@
+diff c653369e862d2b2235133cfcb0391bc4809ce4b1 uncommitted
+--- /dev/null
++++ b/include/npe/sys/times.h
+@@ -1,0 +1,29 @@
++#ifndef _npe_sys_times_h_
++#define _npe_sys_times_h_
++
++#include <npe.h>
++#include <time.h>
++
++#ifndef _CLOCK_T
++#define _CLOCK_T
++typedef long clock_t;
++#endif
++
++struct tms {
++ clock_t tms_utime;
++ clock_t tms_stime;
++ clock_t tms_cutime;
++ clock_t tms_cstime;
++};
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++clock_t times2pe(struct tms *);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+--- a/include/npe/time.h
++++ b/include/npe/time.h
+@@ -3,7 +3,21 @@
+
+ #include <npe.h>
+
++#include <stddef.h>
++
++#define CLOCKS_PER_SEC 1000
++
++/* obsolsecent, but required */
++#define CLK_TCK CLOCKS_PER_SEC
++
++#ifndef _CLOCK_T
++#define _CLOCK_T
++typedef long clock_t;
++#endif
++#ifndef _TIME_T
++#define _TIME_T
+ typedef long time_t;
++#endif
+
+ struct tm {
+ int tm_sec;
+@@ -19,6 +33,7 @@
+
+ #include <sys/time.h>
+
++clock_t clock(void);
+ #define localtime npe_localtime
+ struct tm *npe_localtime(time_t *timep);
+ #define gmtime npe_gmtime
+--- /dev/null
++++ b/libnpe/clock.c
+@@ -1,0 +1,12 @@
++#include <time.h>
++#include <sys/times.h>
++
++clock_t
++clock(void)
++{
++ struct tms t;
++
++ if(times2pe(&t) == (clock_t)-1)
++ return (clock_t)-1;
++ return t.tms_utime+t.tms_stime;
++}
+--- a/libnpe/mkfile
++++ b/libnpe/mkfile
+@@ -11,6 +11,7 @@
+ OFILES=\
+ _main.$O\
+ _npe.$O\
++ clock.$O\
+ closedir.$O\
+ dirfd.$O\
+ exp2.$O\
+--- /dev/null
++++ b/libnpe/times.c
+@@ -1,0 +1,65 @@
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <fcntl.h>
++#include <sys/times.h>
++#include <unistd.h>
++#include <errno.h>
++#include <string.h>
++#include <stdlib.h>
++
++static
++char*
++skip(char *p)
++{
++
++ while(*p == ' ')
++ p++;
++ while(*p != ' ' && *p != 0)
++ p++;
++ return p;
++}
++
++static clock_t
++times_(struct tms *buf)
++{
++ char b[200], *p;
++ int f;
++ unsigned long r;
++
++ memset(b, 0, sizeof(b));
++ f = open("/dev/cputime", O_RDONLY);
++ if(f >= 0) {
++ lseek(f, SEEK_SET, 0);
++ read(f, b, sizeof(b));
++ close(f);
++ }
++ p = b;
++ if(buf)
++ buf->tms_utime = atol(p);
++ p = skip(p);
++ if(buf)
++ buf->tms_stime = atol(p);
++ p = skip(p);
++ r = atol(p);
++ if(buf){
++ p = skip(p);
++ buf->tms_cutime = atol(p);
++ p = skip(p);
++ buf->tms_cstime = atol(p);
++ }
++ return r;
++}
++
++clock_t
++times2pe(struct tms *buf)
++{
++ long t[4];
++ clock_t r;
++
++ times(&t):
++ buf->tms_utime = t[0];
++ buf->tms_stime = t[1];
++ buf->tms_cutime = t[2];
++ buf->tms_cstime = t[3];
++ return
++}