File: ungetc.s

package info (click to toggle)
cc65 2.19-2
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 20,268 kB
  • sloc: ansic: 117,151; asm: 66,339; pascal: 4,248; makefile: 1,009; perl: 607
file content (71 lines) | stat: -rw-r--r-- 1,398 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
;
; Ullrich von Bassewitz, 2004-05-12
;
; int __fastcall__ ungetc (int c, FILE* f);
; /* Push back a character into a file stream. */
;

        .export         _ungetc

        .import         popax
        .import         ptr1: zp, tmp1: zp

        .include        "_file.inc"
        .include        "errno.inc"


; ------------------------------------------------------------------------
; Code

.proc   _ungetc

; Save the file pointer to ptr1

        sta     ptr1
        stx     ptr1+1

; Get c from stack and save the lower byte in tmp1

        jsr     popax
        sta     tmp1

; c must be in char range

        txa
        bne     error

; Check if the file is open

        ldy     #_FILE::f_flags
        lda     (ptr1),y
        and     #_FOPEN                 ; Is the file open?
        beq     error                   ; Branch if no

; Set the pushback flag and reset the end-of-file indicator

        lda     (ptr1),y
        ora     #_FPUSHBACK
        and     #<~_FEOF
        sta     (ptr1),y

; Store the character into the pushback buffer

        ldy     #_FILE::f_pushback
        lda     tmp1
        sta     (ptr1),y

; Done, return c

        ldx     #0
        rts

; File is not open or the character is invalid

error:  lda     #EINVAL
        jsr     __seterrno
        lda     #$FF                    ; Return -1
        tax
        rts

.endproc