perl 5.0 alpha 2
[p5sagit/p5-mst-13.2.git] / do / truncate
1 int                                     /*SUPPRESS 590*/
2 do_truncate(TARG,arg,gimme,arglast)
3 STR *TARG;
4 register ARG *arg;
5 int gimme;
6 int *arglast;
7 {
8     register ARRAY *ary = stack;
9     register int sp = arglast[0] + 1;
10     off_t len = (off_t)str_gnum(ary->ary_array[sp+1]);
11     int result = 1;
12     STAB *tmpstab;
13
14 #if defined(HAS_TRUNCATE) || defined(HAS_CHSIZE)
15 #ifdef HAS_TRUNCATE
16     if ((arg[1].arg_type & A_MASK) == A_WORD) {
17         tmpstab = arg[1].arg_ptr.arg_stab;
18         if (!stab_io(tmpstab) || !stab_io(tmpstab)->ifp ||
19           ftruncate(fileno(stab_io(tmpstab)->ifp), len) < 0)
20             result = 0;
21     }
22     else if (truncate(str_get(ary->ary_array[sp]), len) < 0)
23         result = 0;
24 #else
25     if ((arg[1].arg_type & A_MASK) == A_WORD) {
26         tmpstab = arg[1].arg_ptr.arg_stab;
27         if (!stab_io(tmpstab) || !stab_io(tmpstab)->ifp ||
28           chsize(fileno(stab_io(tmpstab)->ifp), len) < 0)
29             result = 0;
30     }
31     else {
32         int tmpfd;
33
34         if ((tmpfd = open(str_get(ary->ary_array[sp]), 0)) < 0)
35             result = 0;
36         else {
37             if (chsize(tmpfd, len) < 0)
38                 result = 0;
39             close(tmpfd);
40         }
41     }
42 #endif
43
44     if (result)
45         str_sset(TARG,&str_yes);
46     else
47         str_sset(TARG,&str_undef);
48     STABSET(TARG);
49     ary->ary_array[sp] = TARG;
50     return sp;
51 #else
52     fatal("truncate not implemented");
53 #endif
54 }
55