;
; 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
.segment "LIBCODE"

.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
           
