Message-ID: <20010401095927.6336.qmail@plover.com> To: perl5-porters@perl.org cc: mjd@plover.com Subject: PATCH [5.7.0]: New time function Organization: Plover Systems Date: Sun, 01 Apr 2001 05:59:27 -0400 From: Mark-Jason Dominus The following repairs a longstanding gap in Perl's date and time-handling functions. I hope Jarkko will give it the serious consideration that it deserves. --- pod/perlfunc.pod 2001/03/27 20:00:27 1.1 +++ pod/perlfunc.pod 2001/03/27 20:00:41 @@ -1267,6 +1267,11 @@ input operators typically return C when they run out of data, or if there was an error. +=item epochtime + +Like C, but returns the time of the system epoch instead of +the current time. + =item eval EXPR =item eval BLOCK --- pod/perldelta.pod 2001/03/27 20:00:55 1.1 +++ pod/perldelta.pod 2001/03/27 20:01:07 @@ -125,6 +125,10 @@ There is now an UNTIE method. +=item * + +There is a new C function. + =back =head1 Modules and Pragmata --- opcode.pl 2001/03/27 20:02:11 1.1 +++ opcode.pl 2001/03/27 20:02:21 @@ -767,6 +767,7 @@ tms times ck_null 0 localtime localtime ck_fun t% S? gmtime gmtime ck_fun t% S? +epochtime epochtime ck_null isT0 alarm alarm ck_fun istu% S? sleep sleep ck_fun isT% S? --- toke.c 2001/03/27 20:01:21 1.1 +++ toke.c 2001/03/27 20:01:50 @@ -4197,6 +4197,9 @@ case KEY_endgrent: FUN0(OP_EGRENT); + case KEY_epochtime: + FUN0(OP_EPOCHTIME); + case KEY_for: case KEY_foreach: yylval.ival = CopLINE(PL_curcop); @@ -5173,6 +5176,7 @@ break; case 9: if (strEQ(d,"endnetent")) return -KEY_endnetent; + if (strEQ(d,"epochtime")) return -KEY_epochtime; break; case 10: if (strEQ(d,"endhostent")) return -KEY_endhostent; --- keywords.h 2001/03/27 19:59:47 1.1 +++ keywords.h 2001/03/27 20:00:18 @@ -57,196 +57,197 @@ #define KEY_endpwent 56 #define KEY_endservent 57 #define KEY_eof 58 -#define KEY_eq 59 -#define KEY_eval 60 -#define KEY_exec 61 -#define KEY_exists 62 -#define KEY_exit 63 -#define KEY_exp 64 -#define KEY_fcntl 65 -#define KEY_fileno 66 -#define KEY_flock 67 -#define KEY_for 68 -#define KEY_foreach 69 -#define KEY_fork 70 -#define KEY_format 71 -#define KEY_formline 72 -#define KEY_ge 73 -#define KEY_getc 74 -#define KEY_getgrent 75 -#define KEY_getgrgid 76 -#define KEY_getgrnam 77 -#define KEY_gethostbyaddr 78 -#define KEY_gethostbyname 79 -#define KEY_gethostent 80 -#define KEY_getlogin 81 -#define KEY_getnetbyaddr 82 -#define KEY_getnetbyname 83 -#define KEY_getnetent 84 -#define KEY_getpeername 85 -#define KEY_getpgrp 86 -#define KEY_getppid 87 -#define KEY_getpriority 88 -#define KEY_getprotobyname 89 -#define KEY_getprotobynumber 90 -#define KEY_getprotoent 91 -#define KEY_getpwent 92 -#define KEY_getpwnam 93 -#define KEY_getpwuid 94 -#define KEY_getservbyname 95 -#define KEY_getservbyport 96 -#define KEY_getservent 97 -#define KEY_getsockname 98 -#define KEY_getsockopt 99 -#define KEY_glob 100 -#define KEY_gmtime 101 -#define KEY_goto 102 -#define KEY_grep 103 -#define KEY_gt 104 -#define KEY_hex 105 -#define KEY_if 106 -#define KEY_index 107 -#define KEY_int 108 -#define KEY_ioctl 109 -#define KEY_join 110 -#define KEY_keys 111 -#define KEY_kill 112 -#define KEY_last 113 -#define KEY_lc 114 -#define KEY_lcfirst 115 -#define KEY_le 116 -#define KEY_length 117 -#define KEY_link 118 -#define KEY_listen 119 -#define KEY_local 120 -#define KEY_localtime 121 -#define KEY_lock 122 -#define KEY_log 123 -#define KEY_lstat 124 -#define KEY_lt 125 -#define KEY_m 126 -#define KEY_map 127 -#define KEY_mkdir 128 -#define KEY_msgctl 129 -#define KEY_msgget 130 -#define KEY_msgrcv 131 -#define KEY_msgsnd 132 -#define KEY_my 133 -#define KEY_ne 134 -#define KEY_next 135 -#define KEY_no 136 -#define KEY_not 137 -#define KEY_oct 138 -#define KEY_open 139 -#define KEY_opendir 140 -#define KEY_or 141 -#define KEY_ord 142 -#define KEY_our 143 -#define KEY_pack 144 -#define KEY_package 145 -#define KEY_pipe 146 -#define KEY_pop 147 -#define KEY_pos 148 -#define KEY_print 149 -#define KEY_printf 150 -#define KEY_prototype 151 -#define KEY_push 152 -#define KEY_q 153 -#define KEY_qq 154 -#define KEY_qr 155 -#define KEY_quotemeta 156 -#define KEY_qw 157 -#define KEY_qx 158 -#define KEY_rand 159 -#define KEY_read 160 -#define KEY_readdir 161 -#define KEY_readline 162 -#define KEY_readlink 163 -#define KEY_readpipe 164 -#define KEY_recv 165 -#define KEY_redo 166 -#define KEY_ref 167 -#define KEY_rename 168 -#define KEY_require 169 -#define KEY_reset 170 -#define KEY_return 171 -#define KEY_reverse 172 -#define KEY_rewinddir 173 -#define KEY_rindex 174 -#define KEY_rmdir 175 -#define KEY_s 176 -#define KEY_scalar 177 -#define KEY_seek 178 -#define KEY_seekdir 179 -#define KEY_select 180 -#define KEY_semctl 181 -#define KEY_semget 182 -#define KEY_semop 183 -#define KEY_send 184 -#define KEY_setgrent 185 -#define KEY_sethostent 186 -#define KEY_setnetent 187 -#define KEY_setpgrp 188 -#define KEY_setpriority 189 -#define KEY_setprotoent 190 -#define KEY_setpwent 191 -#define KEY_setservent 192 -#define KEY_setsockopt 193 -#define KEY_shift 194 -#define KEY_shmctl 195 -#define KEY_shmget 196 -#define KEY_shmread 197 -#define KEY_shmwrite 198 -#define KEY_shutdown 199 -#define KEY_sin 200 -#define KEY_sleep 201 -#define KEY_socket 202 -#define KEY_socketpair 203 -#define KEY_sort 204 -#define KEY_splice 205 -#define KEY_split 206 -#define KEY_sprintf 207 -#define KEY_sqrt 208 -#define KEY_srand 209 -#define KEY_stat 210 -#define KEY_study 211 -#define KEY_sub 212 -#define KEY_substr 213 -#define KEY_symlink 214 -#define KEY_syscall 215 -#define KEY_sysopen 216 -#define KEY_sysread 217 -#define KEY_sysseek 218 -#define KEY_system 219 -#define KEY_syswrite 220 -#define KEY_tell 221 -#define KEY_telldir 222 -#define KEY_tie 223 -#define KEY_tied 224 -#define KEY_time 225 -#define KEY_times 226 -#define KEY_tr 227 -#define KEY_truncate 228 -#define KEY_uc 229 -#define KEY_ucfirst 230 -#define KEY_umask 231 -#define KEY_undef 232 -#define KEY_unless 233 -#define KEY_unlink 234 -#define KEY_unpack 235 -#define KEY_unshift 236 -#define KEY_untie 237 -#define KEY_until 238 -#define KEY_use 239 -#define KEY_utime 240 -#define KEY_values 241 -#define KEY_vec 242 -#define KEY_wait 243 -#define KEY_waitpid 244 -#define KEY_wantarray 245 -#define KEY_warn 246 -#define KEY_while 247 -#define KEY_write 248 -#define KEY_x 249 -#define KEY_xor 250 -#define KEY_y 251 +#define KEY_epochtime 59 +#define KEY_eq 60 +#define KEY_eval 61 +#define KEY_exec 62 +#define KEY_exists 63 +#define KEY_exit 64 +#define KEY_exp 65 +#define KEY_fcntl 66 +#define KEY_fileno 67 +#define KEY_flock 68 +#define KEY_for 69 +#define KEY_foreach 70 +#define KEY_fork 71 +#define KEY_format 72 +#define KEY_formline 73 +#define KEY_ge 74 +#define KEY_getc 75 +#define KEY_getgrent 76 +#define KEY_getgrgid 77 +#define KEY_getgrnam 78 +#define KEY_gethostbyaddr 79 +#define KEY_gethostbyname 80 +#define KEY_gethostent 81 +#define KEY_getlogin 82 +#define KEY_getnetbyaddr 83 +#define KEY_getnetbyname 84 +#define KEY_getnetent 85 +#define KEY_getpeername 86 +#define KEY_getpgrp 87 +#define KEY_getppid 88 +#define KEY_getpriority 89 +#define KEY_getprotobyname 90 +#define KEY_getprotobynumber 91 +#define KEY_getprotoent 92 +#define KEY_getpwent 93 +#define KEY_getpwnam 94 +#define KEY_getpwuid 95 +#define KEY_getservbyname 96 +#define KEY_getservbyport 97 +#define KEY_getservent 98 +#define KEY_getsockname 99 +#define KEY_getsockopt 100 +#define KEY_glob 101 +#define KEY_gmtime 102 +#define KEY_goto 103 +#define KEY_grep 104 +#define KEY_gt 105 +#define KEY_hex 106 +#define KEY_if 107 +#define KEY_index 108 +#define KEY_int 109 +#define KEY_ioctl 110 +#define KEY_join 111 +#define KEY_keys 112 +#define KEY_kill 113 +#define KEY_last 114 +#define KEY_lc 115 +#define KEY_lcfirst 116 +#define KEY_le 117 +#define KEY_length 118 +#define KEY_link 119 +#define KEY_listen 120 +#define KEY_local 121 +#define KEY_localtime 122 +#define KEY_lock 123 +#define KEY_log 124 +#define KEY_lstat 125 +#define KEY_lt 126 +#define KEY_m 127 +#define KEY_map 128 +#define KEY_mkdir 129 +#define KEY_msgctl 130 +#define KEY_msgget 131 +#define KEY_msgrcv 132 +#define KEY_msgsnd 133 +#define KEY_my 134 +#define KEY_ne 135 +#define KEY_next 136 +#define KEY_no 137 +#define KEY_not 138 +#define KEY_oct 139 +#define KEY_open 140 +#define KEY_opendir 141 +#define KEY_or 142 +#define KEY_ord 143 +#define KEY_our 144 +#define KEY_pack 145 +#define KEY_package 146 +#define KEY_pipe 147 +#define KEY_pop 148 +#define KEY_pos 149 +#define KEY_print 150 +#define KEY_printf 151 +#define KEY_prototype 152 +#define KEY_push 153 +#define KEY_q 154 +#define KEY_qq 155 +#define KEY_qr 156 +#define KEY_quotemeta 157 +#define KEY_qw 158 +#define KEY_qx 159 +#define KEY_rand 160 +#define KEY_read 161 +#define KEY_readdir 162 +#define KEY_readline 163 +#define KEY_readlink 164 +#define KEY_readpipe 165 +#define KEY_recv 166 +#define KEY_redo 167 +#define KEY_ref 168 +#define KEY_rename 169 +#define KEY_require 170 +#define KEY_reset 171 +#define KEY_return 172 +#define KEY_reverse 173 +#define KEY_rewinddir 174 +#define KEY_rindex 175 +#define KEY_rmdir 176 +#define KEY_s 177 +#define KEY_scalar 178 +#define KEY_seek 179 +#define KEY_seekdir 180 +#define KEY_select 181 +#define KEY_semctl 182 +#define KEY_semget 183 +#define KEY_semop 184 +#define KEY_send 185 +#define KEY_setgrent 186 +#define KEY_sethostent 187 +#define KEY_setnetent 188 +#define KEY_setpgrp 189 +#define KEY_setpriority 190 +#define KEY_setprotoent 191 +#define KEY_setpwent 192 +#define KEY_setservent 193 +#define KEY_setsockopt 194 +#define KEY_shift 195 +#define KEY_shmctl 196 +#define KEY_shmget 197 +#define KEY_shmread 198 +#define KEY_shmwrite 199 +#define KEY_shutdown 200 +#define KEY_sin 201 +#define KEY_sleep 202 +#define KEY_socket 203 +#define KEY_socketpair 204 +#define KEY_sort 205 +#define KEY_splice 206 +#define KEY_split 207 +#define KEY_sprintf 208 +#define KEY_sqrt 209 +#define KEY_srand 210 +#define KEY_stat 211 +#define KEY_study 212 +#define KEY_sub 213 +#define KEY_substr 214 +#define KEY_symlink 215 +#define KEY_syscall 216 +#define KEY_sysopen 217 +#define KEY_sysread 218 +#define KEY_sysseek 219 +#define KEY_system 220 +#define KEY_syswrite 221 +#define KEY_tell 222 +#define KEY_telldir 223 +#define KEY_tie 224 +#define KEY_tied 225 +#define KEY_time 226 +#define KEY_times 227 +#define KEY_tr 228 +#define KEY_truncate 229 +#define KEY_uc 230 +#define KEY_ucfirst 231 +#define KEY_umask 232 +#define KEY_undef 233 +#define KEY_unless 234 +#define KEY_unlink 235 +#define KEY_unpack 236 +#define KEY_unshift 237 +#define KEY_untie 238 +#define KEY_until 239 +#define KEY_use 240 +#define KEY_utime 241 +#define KEY_values 242 +#define KEY_vec 243 +#define KEY_wait 244 +#define KEY_waitpid 245 +#define KEY_wantarray 246 +#define KEY_warn 247 +#define KEY_while 248 +#define KEY_write 249 +#define KEY_x 250 +#define KEY_xor 251 +#define KEY_y 252 --- pp_sys.c 2001/03/27 20:02:41 1.1 +++ pp_sys.c 2001/03/27 20:02:49 @@ -4130,6 +4130,14 @@ return pp_gmtime(); } +PP(pp_epochtime) +{ + dSP; + EXTEND(SP, 1); + PUSHs(sv_2mortal(newSViv(0))); + RETURN; +} + PP(pp_gmtime) { djSP; --- t/op/time.t 2001/03/27 20:03:57 1.1 +++ t/op/time.t 2001/03/27 20:04:29 @@ -1,9 +1,9 @@ #!./perl -# $RCSfile: time.t,v $$Revision: 1.1 $$Date: 2001/03/27 20:03:57 $ +# $RCSfile: time.t,v $$Revision: 1.1 $$Date: 2001/03/27 19:24:00 $ -if ($does_gmtime = gmtime(time)) { print "1..6\n" } -else { print "1..3\n" } +if ($does_gmtime = gmtime(time)) { print "1..7\n" } +else { print "1..4\n" } ($beguser,$begsys) = times; @@ -33,21 +33,25 @@ exit 0 unless $does_gmtime; +if (epochtime() != 0) { print "not " } +print "ok 4\n"; + ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime($beg); ($xsec,$foo) = localtime($now); if ($sec != $xsec && $mday && $year) - {print "ok 4\n";} + {print "ok 5\n";} else - {print "not ok 4\n";} + {print "not ok 5\n";} if (index(" :0:1:-1:364:365:-364:-365:",':' . ($localyday - $yday) . ':') > 0) - {print "ok 5\n";} + {print "ok 6\n";} else - {print "not ok 5\n";} + {print "not ok 6\n";} # This could be stricter. if (gmtime() =~ /^(Sun|Mon|Tue|Wed|Thu|Fri|Sat) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ([ \d]\d) (\d\d):(\d\d):(\d\d) (\d\d\d\d)$/) - {print "ok 6\n";} + {print "ok 7\n";} else - {print "not ok 6\n";} + {print "not ok 7\n";} +