comparison src/editfns.c @ 30480:5ef94127f946

new function: float-time
author Sam Steingold <sds@gnu.org>
date Wed, 26 Jul 2000 18:41:15 +0000
parents c084f49c2a7f
children fef49230e1aa
comparison
equal deleted inserted replaced
30479:bc0a97df8aed 30480:5ef94127f946
120 /* If the user name claimed in the environment vars differs from 120 /* If the user name claimed in the environment vars differs from
121 the real uid, use the claimed name to find the full name. */ 121 the real uid, use the claimed name to find the full name. */
122 tem = Fstring_equal (Vuser_login_name, Vuser_real_login_name); 122 tem = Fstring_equal (Vuser_login_name, Vuser_real_login_name);
123 Vuser_full_name = Fuser_full_name (NILP (tem)? make_number (geteuid()) 123 Vuser_full_name = Fuser_full_name (NILP (tem)? make_number (geteuid())
124 : Vuser_login_name); 124 : Vuser_login_name);
125 125
126 p = (unsigned char *) getenv ("NAME"); 126 p = (unsigned char *) getenv ("NAME");
127 if (p) 127 if (p)
128 Vuser_full_name = build_string (p); 128 Vuser_full_name = build_string (p);
129 else if (NILP (Vuser_full_name)) 129 else if (NILP (Vuser_full_name))
130 Vuser_full_name = build_string ("unknown"); 130 Vuser_full_name = build_string ("unknown");
683 == current_buffer); 683 == current_buffer);
684 684
685 return Fcons (Fpoint_marker (), 685 return Fcons (Fpoint_marker (),
686 Fcons (Fcopy_marker (current_buffer->mark, Qnil), 686 Fcons (Fcopy_marker (current_buffer->mark, Qnil),
687 Fcons (visible ? Qt : Qnil, 687 Fcons (visible ? Qt : Qnil,
688 current_buffer->mark_active))); 688 current_buffer->mark_active)));
689 } 689 }
690 690
691 Lisp_Object 691 Lisp_Object
692 save_excursion_restore (info) 692 save_excursion_restore (info)
693 Lisp_Object info; 693 Lisp_Object info;
976 else 976 else
977 { 977 {
978 CHECK_NUMBER_COERCE_MARKER (pos, 0); 978 CHECK_NUMBER_COERCE_MARKER (pos, 0);
979 if (XINT (pos) < BEGV || XINT (pos) >= ZV) 979 if (XINT (pos) < BEGV || XINT (pos) >= ZV)
980 return Qnil; 980 return Qnil;
981 981
982 pos_byte = CHAR_TO_BYTE (XINT (pos)); 982 pos_byte = CHAR_TO_BYTE (XINT (pos));
983 } 983 }
984 984
985 return make_number (FETCH_CHAR (pos_byte)); 985 return make_number (FETCH_CHAR (pos_byte));
986 } 986 }
1102 register unsigned char *p, *q; 1102 register unsigned char *p, *q;
1103 extern char *index (); 1103 extern char *index ();
1104 Lisp_Object full; 1104 Lisp_Object full;
1105 1105
1106 if (NILP (uid)) 1106 if (NILP (uid))
1107 return Vuser_full_name; 1107 return Vuser_full_name;
1108 else if (NUMBERP (uid)) 1108 else if (NUMBERP (uid))
1109 pw = (struct passwd *) getpwuid (XINT (uid)); 1109 pw = (struct passwd *) getpwuid (XINT (uid));
1110 else if (STRINGP (uid)) 1110 else if (STRINGP (uid))
1111 pw = (struct passwd *) getpwnam (XSTRING (uid)->data); 1111 pw = (struct passwd *) getpwnam (XSTRING (uid)->data);
1112 else 1112 else
1113 error ("Invalid UID specification"); 1113 error ("Invalid UID specification");
1114 1114
1115 if (!pw) 1115 if (!pw)
1116 return Qnil; 1116 return Qnil;
1117 1117
1118 p = (unsigned char *) USER_FULL_NAME; 1118 p = (unsigned char *) USER_FULL_NAME;
1119 /* Chop off everything after the first comma. */ 1119 /* Chop off everything after the first comma. */
1120 q = (unsigned char *) index (p, ','); 1120 q = (unsigned char *) index (p, ',');
1121 full = make_string (p, q ? q - p : strlen (p)); 1121 full = make_string (p, q ? q - p : strlen (p));
1122 1122
1123 #ifdef AMPERSAND_FULL_NAME 1123 #ifdef AMPERSAND_FULL_NAME
1124 p = XSTRING (full)->data; 1124 p = XSTRING (full)->data;
1125 q = (unsigned char *) index (p, '&'); 1125 q = (unsigned char *) index (p, '&');
1126 /* Substitute the login name for the &, upcasing the first character. */ 1126 /* Substitute the login name for the &, upcasing the first character. */
1127 if (q) 1127 if (q)
1189 return Flist (3, result); 1189 return Flist (3, result);
1190 } 1190 }
1191 1191
1192 1192
1193 static int 1193 static int
1194 lisp_time_argument (specified_time, result) 1194 lisp_time_argument (specified_time, result, usec)
1195 Lisp_Object specified_time; 1195 Lisp_Object specified_time;
1196 time_t *result; 1196 time_t *result;
1197 int *usec;
1197 { 1198 {
1198 if (NILP (specified_time)) 1199 if (NILP (specified_time))
1199 return time (result) != -1; 1200 {
1201 if (usec)
1202 {
1203 EMACS_TIME t;
1204
1205 if (-1 == EMACS_GET_TIME (t))
1206 return 0;
1207 *usec = EMACS_USECS (t);
1208 *result = EMACS_SECS (t);
1209 return 1;
1210 }
1211 else
1212 return time (result) != -1;
1213 }
1200 else 1214 else
1201 { 1215 {
1202 Lisp_Object high, low; 1216 Lisp_Object high, low;
1203 high = Fcar (specified_time); 1217 high = Fcar (specified_time);
1204 CHECK_NUMBER (high, 0); 1218 CHECK_NUMBER (high, 0);
1205 low = Fcdr (specified_time); 1219 low = Fcdr (specified_time);
1206 if (CONSP (low)) 1220 if (CONSP (low))
1207 low = Fcar (low); 1221 {
1222 if (usec)
1223 {
1224 Lisp_Object usec_l = Fcdr (low);
1225 if (CONSP (usec_l))
1226 usec_l = Fcar (usec_l);
1227 if (NILP (usec_l))
1228 *usec = 0;
1229 else
1230 {
1231 CHECK_NUMBER (usec_l, 0);
1232 *usec = XINT (usec_l);
1233 }
1234 }
1235 low = Fcar (low);
1236 }
1237 else if (usec)
1238 *usec = 0;
1208 CHECK_NUMBER (low, 0); 1239 CHECK_NUMBER (low, 0);
1209 *result = (XINT (high) << 16) + (XINT (low) & 0xffff); 1240 *result = (XINT (high) << 16) + (XINT (low) & 0xffff);
1210 return *result >> 16 == XINT (high); 1241 return *result >> 16 == XINT (high);
1211 } 1242 }
1243 }
1244
1245 DEFUN ("float-time", Ffloat_time, Sfloat_time, 0, 1, 0,
1246 "Return the current time, as a float number of seconds since the epoch.\n\
1247 If an argument is given, it specifies a time to convert to float\n\
1248 instead of the current time. The argument should have the forms:\n\
1249 (HIGH . LOW) or (HIGH LOW USEC) or (HIGH LOW . USEC).\n\
1250 Thus, you can use times obtained from `current-time'\n\
1251 and from `file-attributes'.")
1252 (specified_time)
1253 Lisp_Object specified_time;
1254 {
1255 time_t sec;
1256 int usec;
1257
1258 if (! lisp_time_argument (specified_time, &sec, &usec))
1259 error ("Invalid time specification");
1260
1261 return make_float (sec + usec * 0.0000001);
1212 } 1262 }
1213 1263
1214 /* Write information into buffer S of size MAXSIZE, according to the 1264 /* Write information into buffer S of size MAXSIZE, according to the
1215 FORMAT of length FORMAT_LEN, using time information taken from *TP. 1265 FORMAT of length FORMAT_LEN, using time information taken from *TP.
1216 Default to Universal Time if UT is nonzero, local time otherwise. 1266 Default to Universal Time if UT is nonzero, local time otherwise.
1326 struct tm *tm; 1376 struct tm *tm;
1327 int ut = ! NILP (universal); 1377 int ut = ! NILP (universal);
1328 1378
1329 CHECK_STRING (format_string, 1); 1379 CHECK_STRING (format_string, 1);
1330 1380
1331 if (! lisp_time_argument (time, &value)) 1381 if (! lisp_time_argument (time, &value, NULL))
1332 error ("Invalid time specification"); 1382 error ("Invalid time specification");
1333 1383
1334 format_string = code_convert_string_norecord (format_string, 1384 format_string = code_convert_string_norecord (format_string,
1335 Vlocale_coding_system, 1); 1385 Vlocale_coding_system, 1);
1336 1386
1383 { 1433 {
1384 time_t time_spec; 1434 time_t time_spec;
1385 struct tm save_tm; 1435 struct tm save_tm;
1386 struct tm *decoded_time; 1436 struct tm *decoded_time;
1387 Lisp_Object list_args[9]; 1437 Lisp_Object list_args[9];
1388 1438
1389 if (! lisp_time_argument (specified_time, &time_spec)) 1439 if (! lisp_time_argument (specified_time, &time_spec, NULL))
1390 error ("Invalid time specification"); 1440 error ("Invalid time specification");
1391 1441
1392 decoded_time = localtime (&time_spec); 1442 decoded_time = localtime (&time_spec);
1393 if (! decoded_time) 1443 if (! decoded_time)
1394 error ("Specified time is not representable"); 1444 error ("Specified time is not representable");
1458 else 1508 else
1459 { 1509 {
1460 char tzbuf[100]; 1510 char tzbuf[100];
1461 char *tzstring; 1511 char *tzstring;
1462 char **oldenv = environ, **newenv; 1512 char **oldenv = environ, **newenv;
1463 1513
1464 if (EQ (zone, Qt)) 1514 if (EQ (zone, Qt))
1465 tzstring = "UTC0"; 1515 tzstring = "UTC0";
1466 else if (STRINGP (zone)) 1516 else if (STRINGP (zone))
1467 tzstring = (char *) XSTRING (zone)->data; 1517 tzstring = (char *) XSTRING (zone)->data;
1468 else if (INTEGERP (zone)) 1518 else if (INTEGERP (zone))
1473 tzstring = tzbuf; 1523 tzstring = tzbuf;
1474 } 1524 }
1475 else 1525 else
1476 error ("Invalid time zone specification"); 1526 error ("Invalid time zone specification");
1477 1527
1478 /* Set TZ before calling mktime; merely adjusting mktime's returned 1528 /* Set TZ before calling mktime; merely adjusting mktime's returned
1479 value doesn't suffice, since that would mishandle leap seconds. */ 1529 value doesn't suffice, since that would mishandle leap seconds. */
1480 set_time_zone_rule (tzstring); 1530 set_time_zone_rule (tzstring);
1481 1531
1482 time = mktime (&tm); 1532 time = mktime (&tm);
1483 1533
1516 { 1566 {
1517 time_t value; 1567 time_t value;
1518 char buf[30]; 1568 char buf[30];
1519 register char *tem; 1569 register char *tem;
1520 1570
1521 if (! lisp_time_argument (specified_time, &value)) 1571 if (! lisp_time_argument (specified_time, &value, NULL))
1522 value = -1; 1572 value = -1;
1523 tem = (char *) ctime (&value); 1573 tem = (char *) ctime (&value);
1524 1574
1525 strncpy (buf, tem, 24); 1575 strncpy (buf, tem, 24);
1526 buf[24] = 0; 1576 buf[24] = 0;
1576 { 1626 {
1577 time_t value; 1627 time_t value;
1578 struct tm *t; 1628 struct tm *t;
1579 struct tm gmt; 1629 struct tm gmt;
1580 1630
1581 if (lisp_time_argument (specified_time, &value) 1631 if (lisp_time_argument (specified_time, &value, NULL)
1582 && (t = gmtime (&value)) != 0 1632 && (t = gmtime (&value)) != 0
1583 && (gmt = *t, t = localtime (&value)) != 0) 1633 && (gmt = *t, t = localtime (&value)) != 0)
1584 { 1634 {
1585 int offset = tm_diff (t, &gmt); 1635 int offset = tm_diff (t, &gmt);
1586 char *s = 0; 1636 char *s = 0;
1642 #ifdef LOCALTIME_CACHE 1692 #ifdef LOCALTIME_CACHE
1643 1693
1644 /* These two values are known to load tz files in buggy implementations, 1694 /* These two values are known to load tz files in buggy implementations,
1645 i.e. Solaris 1 executables running under either Solaris 1 or Solaris 2. 1695 i.e. Solaris 1 executables running under either Solaris 1 or Solaris 2.
1646 Their values shouldn't matter in non-buggy implementations. 1696 Their values shouldn't matter in non-buggy implementations.
1647 We don't use string literals for these strings, 1697 We don't use string literals for these strings,
1648 since if a string in the environment is in readonly 1698 since if a string in the environment is in readonly
1649 storage, it runs afoul of bugs in SVR4 and Solaris 2.3. 1699 storage, it runs afoul of bugs in SVR4 and Solaris 2.3.
1650 See Sun bugs 1113095 and 1114114, ``Timezone routines 1700 See Sun bugs 1113095 and 1114114, ``Timezone routines
1651 improperly modify environment''. */ 1701 improperly modify environment''. */
1652 1702
2400 current_buffer->auto_save_modified++; 2450 current_buffer->auto_save_modified++;
2401 } 2451 }
2402 } 2452 }
2403 2453
2404 /* Take care of the case where the new character 2454 /* Take care of the case where the new character
2405 combines with neighboring bytes. */ 2455 combines with neighboring bytes. */
2406 if (maybe_byte_combining 2456 if (maybe_byte_combining
2407 && (maybe_byte_combining == COMBINING_AFTER 2457 && (maybe_byte_combining == COMBINING_AFTER
2408 ? (pos_byte_next < Z_BYTE 2458 ? (pos_byte_next < Z_BYTE
2409 && ! CHAR_HEAD_P (FETCH_BYTE (pos_byte_next))) 2459 && ! CHAR_HEAD_P (FETCH_BYTE (pos_byte_next)))
2410 : ((pos_byte_next < Z_BYTE 2460 : ((pos_byte_next < Z_BYTE
2431 POS. So, to cancel the later increment of POS, 2481 POS. So, to cancel the later increment of POS,
2432 decrease it now. */ 2482 decrease it now. */
2433 pos--; 2483 pos--;
2434 else 2484 else
2435 INC_POS (pos_byte_next); 2485 INC_POS (pos_byte_next);
2436 2486
2437 if (! NILP (noundo)) 2487 if (! NILP (noundo))
2438 current_buffer->undo_list = tem; 2488 current_buffer->undo_list = tem;
2439 2489
2440 UNGCPRO; 2490 UNGCPRO;
2441 } 2491 }
2509 { 2559 {
2510 nc = tt[oc]; 2560 nc = tt[oc];
2511 if (nc != oc) 2561 if (nc != oc)
2512 { 2562 {
2513 /* Take care of the case where the new character 2563 /* Take care of the case where the new character
2514 combines with neighboring bytes. */ 2564 combines with neighboring bytes. */
2515 if (!ASCII_BYTE_P (nc) 2565 if (!ASCII_BYTE_P (nc)
2516 && (CHAR_HEAD_P (nc) 2566 && (CHAR_HEAD_P (nc)
2517 ? ! CHAR_HEAD_P (FETCH_BYTE (pos_byte + 1)) 2567 ? ! CHAR_HEAD_P (FETCH_BYTE (pos_byte + 1))
2518 : (pos_byte > BEG_BYTE 2568 : (pos_byte > BEG_BYTE
2519 && ! ASCII_BYTE_P (FETCH_BYTE (pos_byte - 1))))) 2569 && ! ASCII_BYTE_P (FETCH_BYTE (pos_byte - 1)))))
2846 if ((nargs & 1) == 0 || nargs < 3) 2896 if ((nargs & 1) == 0 || nargs < 3)
2847 error ("Wrong number of arguments"); 2897 error ("Wrong number of arguments");
2848 2898
2849 properties = string = Qnil; 2899 properties = string = Qnil;
2850 GCPRO2 (properties, string); 2900 GCPRO2 (properties, string);
2851 2901
2852 /* First argument must be a string. */ 2902 /* First argument must be a string. */
2853 CHECK_STRING (args[0], 0); 2903 CHECK_STRING (args[0], 0);
2854 string = Fcopy_sequence (args[0]); 2904 string = Fcopy_sequence (args[0]);
2855 2905
2856 for (i = 1; i < nargs; i += 2) 2906 for (i = 1; i < nargs; i += 2)
3013 else 3063 else
3014 if (*format != 'd' && *format != 'o' && *format != 'x' 3064 if (*format != 'd' && *format != 'o' && *format != 'x'
3015 && *format != 'i' && *format != 'X' && *format != 'c') 3065 && *format != 'i' && *format != 'X' && *format != 'c')
3016 error ("Invalid format operation %%%c", *format); 3066 error ("Invalid format operation %%%c", *format);
3017 3067
3018 thissize = 30; 3068 thissize = 30;
3019 if (*format == 'c' 3069 if (*format == 'c'
3020 && (! SINGLE_BYTE_CHAR_P (XINT (args[n])) 3070 && (! SINGLE_BYTE_CHAR_P (XINT (args[n]))
3021 || XINT (args[n]) == 0)) 3071 || XINT (args[n]) == 0))
3022 { 3072 {
3023 if (! multibyte) 3073 if (! multibyte)
3046 goto retry; 3096 goto retry;
3047 } 3097 }
3048 args[n] = tem; 3098 args[n] = tem;
3049 goto string; 3099 goto string;
3050 } 3100 }
3051 3101
3052 if (thissize < minlen) 3102 if (thissize < minlen)
3053 thissize = minlen; 3103 thissize = minlen;
3054 3104
3055 total += thissize + 4; 3105 total += thissize + 4;
3056 } 3106 }
3145 { 3195 {
3146 int nbytes = nargs * sizeof *info; 3196 int nbytes = nargs * sizeof *info;
3147 info = (struct info *) alloca (nbytes); 3197 info = (struct info *) alloca (nbytes);
3148 bzero (info, nbytes); 3198 bzero (info, nbytes);
3149 } 3199 }
3150 3200
3151 info[n].start = start; 3201 info[n].start = start;
3152 info[n].end = nchars; 3202 info[n].end = nchars;
3153 } 3203 }
3154 } 3204 }
3155 else if (INTEGERP (args[n]) || FLOATP (args[n])) 3205 else if (INTEGERP (args[n]) || FLOATP (args[n]))
3212 xfree (buf); 3262 xfree (buf);
3213 3263
3214 /* If the format string has text properties, or any of the string 3264 /* If the format string has text properties, or any of the string
3215 arguments has text properties, set up text properties of the 3265 arguments has text properties, set up text properties of the
3216 result string. */ 3266 result string. */
3217 3267
3218 if (XSTRING (args[0])->intervals || info) 3268 if (XSTRING (args[0])->intervals || info)
3219 { 3269 {
3220 Lisp_Object len, new_len, props; 3270 Lisp_Object len, new_len, props;
3221 struct gcpro gcpro1; 3271 struct gcpro gcpro1;
3222 3272
3223 /* Add text properties from the format string. */ 3273 /* Add text properties from the format string. */
3224 len = make_number (XSTRING (args[0])->size); 3274 len = make_number (XSTRING (args[0])->size);
3225 props = text_property_list (args[0], make_number (0), len, Qnil); 3275 props = text_property_list (args[0], make_number (0), len, Qnil);
3226 GCPRO1 (props); 3276 GCPRO1 (props);
3227 3277
3228 if (CONSP (props)) 3278 if (CONSP (props))
3229 { 3279 {
3230 new_len = make_number (XSTRING (val)->size); 3280 new_len = make_number (XSTRING (val)->size);
3231 extend_property_ranges (props, len, new_len); 3281 extend_property_ranges (props, len, new_len);
3232 add_text_properties_from_list (val, props, make_number (0)); 3282 add_text_properties_from_list (val, props, make_number (0));
3315 START2_BYTE, END2_BYTE are the byte positions. 3365 START2_BYTE, END2_BYTE are the byte positions.
3316 3366
3317 Traverses the entire marker list of the buffer to do so, adding an 3367 Traverses the entire marker list of the buffer to do so, adding an
3318 appropriate amount to some, subtracting from some, and leaving the 3368 appropriate amount to some, subtracting from some, and leaving the
3319 rest untouched. Most of this is copied from adjust_markers in insdel.c. 3369 rest untouched. Most of this is copied from adjust_markers in insdel.c.
3320 3370
3321 It's the caller's job to ensure that START1 <= END1 <= START2 <= END2. */ 3371 It's the caller's job to ensure that START1 <= END1 <= START2 <= END2. */
3322 3372
3323 void 3373 void
3324 transpose_markers (start1, end1, start2, end2, 3374 transpose_markers (start1, end1, start2, end2,
3325 start1_byte, end1_byte, start2_byte, end2_byte) 3375 start1_byte, end1_byte, start2_byte, end2_byte)
3352 the dirty work to Fmarker_position, below. */ 3402 the dirty work to Fmarker_position, below. */
3353 3403
3354 /* The difference between the region's lengths */ 3404 /* The difference between the region's lengths */
3355 diff = (end2 - start2) - (end1 - start1); 3405 diff = (end2 - start2) - (end1 - start1);
3356 diff_byte = (end2_byte - start2_byte) - (end1_byte - start1_byte); 3406 diff_byte = (end2_byte - start2_byte) - (end1_byte - start1_byte);
3357 3407
3358 /* For shifting each marker in a region by the length of the other 3408 /* For shifting each marker in a region by the length of the other
3359 region plus the distance between the regions. */ 3409 region plus the distance between the regions. */
3360 amt1 = (end2 - start2) + (start2 - end1); 3410 amt1 = (end2 - start2) + (start2 - end1);
3361 amt2 = (end1 - start1) + (start2 - end1); 3411 amt2 = (end1 - start1) + (start2 - end1);
3362 amt1_byte = (end2_byte - start2_byte) + (start2_byte - end1_byte); 3412 amt1_byte = (end2_byte - start2_byte) + (start2_byte - end1_byte);
3441 3491
3442 /* The possibilities are: 3492 /* The possibilities are:
3443 1. Adjacent (contiguous) regions, or separate but equal regions 3493 1. Adjacent (contiguous) regions, or separate but equal regions
3444 (no, really equal, in this case!), or 3494 (no, really equal, in this case!), or
3445 2. Separate regions of unequal size. 3495 2. Separate regions of unequal size.
3446 3496
3447 The worst case is usually No. 2. It means that (aside from 3497 The worst case is usually No. 2. It means that (aside from
3448 potential need for getting the gap out of the way), there also 3498 potential need for getting the gap out of the way), there also
3449 needs to be a shifting of the text between the two regions. So 3499 needs to be a shifting of the text between the two regions. So
3450 if they are spread far apart, we are that much slower... sigh. */ 3500 if they are spread far apart, we are that much slower... sigh. */
3451 3501
3720 functions if all the text being accessed has this property."); 3770 functions if all the text being accessed has this property.");
3721 Vbuffer_access_fontified_property = Qnil; 3771 Vbuffer_access_fontified_property = Qnil;
3722 3772
3723 DEFVAR_LISP ("system-name", &Vsystem_name, 3773 DEFVAR_LISP ("system-name", &Vsystem_name,
3724 "The name of the machine Emacs is running on."); 3774 "The name of the machine Emacs is running on.");
3725 3775
3726 DEFVAR_LISP ("user-full-name", &Vuser_full_name, 3776 DEFVAR_LISP ("user-full-name", &Vuser_full_name,
3727 "The full name of the user logged in."); 3777 "The full name of the user logged in.");
3728 3778
3729 DEFVAR_LISP ("user-login-name", &Vuser_login_name, 3779 DEFVAR_LISP ("user-login-name", &Vuser_login_name,
3730 "The user's name, taken from environment variables if possible."); 3780 "The user's name, taken from environment variables if possible.");
3796 defsubr (&Suser_real_uid); 3846 defsubr (&Suser_real_uid);
3797 defsubr (&Suser_full_name); 3847 defsubr (&Suser_full_name);
3798 defsubr (&Semacs_pid); 3848 defsubr (&Semacs_pid);
3799 defsubr (&Scurrent_time); 3849 defsubr (&Scurrent_time);
3800 defsubr (&Sformat_time_string); 3850 defsubr (&Sformat_time_string);
3851 defsubr (&Sfloat_time);
3801 defsubr (&Sdecode_time); 3852 defsubr (&Sdecode_time);
3802 defsubr (&Sencode_time); 3853 defsubr (&Sencode_time);
3803 defsubr (&Scurrent_time_string); 3854 defsubr (&Scurrent_time_string);
3804 defsubr (&Scurrent_time_zone); 3855 defsubr (&Scurrent_time_zone);
3805 defsubr (&Sset_time_zone_rule); 3856 defsubr (&Sset_time_zone_rule);