/*
 * tc.decls.h: Function declarations from all the tcsh modules
 */
/*-
 * Copyright (c) 1980, 1991 The Regents of the University of California.
 * All rights reserved.
 *
 * Copyright (c) 2026
 * Project Tick. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */
#ifndef _h_tc_decls
#define _h_tc_decls

struct blk_buf;
struct strbuf;
struct Strbuf;

/*
 * tc.alloc.c
 */
#ifndef SYSMALLOC
#ifndef WINNT_NATIVE
#ifndef __linux__
extern	void		  free		(ptr_t);
extern	memalign_t	  malloc	(size_t);
extern	memalign_t	  realloc	(ptr_t, size_t);
extern	memalign_t	  calloc	(size_t, size_t);
#endif
#endif /* !WINNT_NATIVE */
#else /* SYSMALLOC */
extern	void		  sfree		(ptr_t);
extern	memalign_t	  smalloc	(size_t);
extern	memalign_t	  srealloc	(ptr_t, size_t);
extern	memalign_t	  scalloc	(size_t, size_t);
#endif /* SYSMALLOC */
extern	void		  showall	(Char **, struct command *);

/*
 * tc.bind.c
 */
extern	void		  dobindkey	(Char **, struct command *);

/*
 * tc.defs.c:
 */
extern	void		  getmachine	(void);


/*
 * tc.disc.c
 */
extern	int		  setdisc	(int);
extern	int		  resetdisc	(int);

/*
 * tc.func.c
 */
extern	Char		 *expand_lex    (const struct wordent *, int, int);
extern	Char		 *sprlex	(const struct wordent *);
extern	Char		 *Itoa		(int, size_t, Char);
extern	void		  dolist	(Char **, struct command *);
extern	void		  dotermname	(Char **, struct command *);
extern	void		  dotelltc	(Char **, struct command *);
extern	void		  doechotc	(Char **, struct command *);
extern	void		  dosettc	(Char **, struct command *);
extern	int		  cmd_expand	(Char *, Char **);
extern	void		  dowhich	(Char **, struct command *);
extern	struct process	 *find_stop_ed	(void);
extern	void		  fg_proc_entry	(struct process *);
extern	void		  alrmcatch	(void);
extern	void		  precmd	(void);
extern	void		  postcmd	(void);
extern	void		  cwd_cmd	(void);
extern	void		  beep_cmd	(void);
extern	void		  period_cmd	(void);
extern	void		  job_cmd	(Char *);
extern	void		  aliasrun	(int, Char *, Char *);
extern	void		  setalarm	(int);
extern	void		  rmstar	(struct wordent *);
extern	void		  continue_jobs	(struct wordent *);
extern	Char		 *gettilde	(const Char *);
extern	Char		 *getusername	(Char **);
#ifdef OBSOLETE
extern	void		  doaliases	(Char **, struct command *);
#endif /* OBSOLETE */
extern	void		  shlvl		(int);
extern	int		  fixio		(int, int);
extern	int		  collate	(const Char *, const Char *);
#ifdef HASHBANG
extern	int		  hashbang	(int, Char ***);
#endif /* HASHBANG */
#ifdef REMOTEHOST
extern	void		  remotehost	(void);
#endif /* REMOTEHOST */


/*
 * tc.os.c
 */
#ifdef MACH
extern	void		  dosetpath	(Char **, struct command *);
#endif /* MACH */

#ifdef TCF
extern	void		  dogetxvers	(Char **, struct command *);
extern	void		  dosetxvers	(Char **, struct command *);
extern	void		  dogetspath	(Char **, struct command *);
extern	void		  dosetspath	(Char **, struct command *);
extern	char		 *sitename	(pid_t);
extern	void		  domigrate	(Char **, struct command *);
#endif /* TCF */

#ifdef WARP
extern	void 		  dowarp	(Char **, struct command *);
#endif /* WARP */

#if defined(_CRAY) && !defined(_CRAYMPP)
extern	void 		  dodmmode	(Char **, struct command *);
#endif /* _CRAY && !_CRAYMPP */

#if defined(masscomp) || defined(hcx)
extern	void		  douniverse	(Char **, struct command *);
#endif /* masscomp */

#if defined(_OSD_POSIX) /* BS2000 */
extern	void		  dobs2cmd	(Char **, struct command *);
#endif /* _OSD_POSIX */

#if defined(hcx)
extern	void		  doatt		(Char **, struct command *);
extern	void		  doucb		(Char **, struct command *);
#endif /* hcx */

#ifdef _SEQUENT_
extern	void	 	  pr_stat_sub	(struct process_stats *,
					 struct process_stats *,
					 struct process_stats *);
#endif /* _SEQUENT_ */

#ifdef NEEDtcgetpgrp
extern	pid_t	 	  xtcgetpgrp	(int);
extern	int		  xtcsetpgrp	(int, int);
# undef tcgetpgrp
# define tcgetpgrp(a) 	  xtcgetpgrp(a)
# undef tcsetpgrp
# define tcsetpgrp(a, b)  xtcsetpgrp((a), (b))
#endif /* NEEDtcgetpgrp */

#ifdef YPBUGS
extern	void	 	  fix_yp_bugs	(void);
#endif /* YPBUGS */
#ifdef STRCOLLBUG
extern	void	 	  fix_strcoll_bug	(void);
#endif /* STRCOLLBUG */

extern	void	 	  osinit	(void);

#ifndef HAVE_MEMMOVE
extern void 		*xmemmove	(void *, const void *, size_t);
# define memmove(a, b, c) xmemmove(a, b, c)
#endif /* !HAVE_MEMMOVE */

#ifndef HAVE_MEMSET
extern void 		*xmemset	(void *, int, size_t);
# define memset(a, b, c) xmemset(a, b, c)
#endif /* !HAVE_MEMSET */


#ifndef HAVE_GETCWD
extern	char		 *xgetcwd	(char *, size_t);
# undef getcwd
# define getcwd(a, b) xgetcwd(a, b)
#endif /* !HAVE_GETCWD */

#ifndef HAVE_GETHOSTNAME
extern	int	 	  xgethostname	(char *, int);
# undef gethostname
# define gethostname(a, b) xgethostname(a, b)
#endif /* !HAVE_GETHOSTNAME */

#ifndef HAVE_NICE
extern	int	 	  xnice	(int);
# undef nice
# define nice(a)	  xnice(a)
#endif /* !HAVE_NICE */

#ifndef HAVE_STRERROR
extern	char	 	 *xstrerror	(int);
# undef strerror
# define strerror(a) 	  xstrerror(a)
#endif /* !HAVE_STRERROR */

#ifdef apollo
extern	void		  doinlib	(Char **, struct command *);
extern	void		  dover		(Char **, struct command *);
extern	void		  dorootnode	(Char **, struct command *);
extern	int		  getv		(Char *);
#endif /* apollo */


/*
 * tc.printf.h
 */
#ifndef __GNUC__
#define __attribute__(a)
#endif
extern	int		  xprintf	(const char *, ...)
    __attribute__((__format__(__printf__, 1, 2)));
extern	int		  xsnprintf	(char *, size_t, const char *, ...)
    __attribute__((__format__(__printf__, 3, 4)));
extern	char		 *xasprintf	(const char *, ...)
    __attribute__((__format__(__printf__, 1, 2)));
extern	int		  xvprintf	(const char *, va_list)
    __attribute__((__format__(__printf__, 1, 0)));
extern	int		  xvsnprintf	(char *, size_t, const char *, va_list)
    __attribute__((__format__(__printf__, 3, 0)));
extern	char		 *xvasprintf	(const char *, va_list)
    __attribute__((__format__(__printf__, 1, 0)));

/*
 * tc.prompt.c
 */
extern	void		  dateinit	(void);
extern	void		  printprompt	(int, const char *);
extern  int 		  expdollar	(struct Strbuf *, const Char **, Char);
extern	Char		 *tprintf	(int, const Char *, const char *,
					 time_t, ptr_t);

/*
 * tc.sched.c
 */
extern	time_t		  sched_next	(void);
extern	void		  dosched	(Char **, struct command *);
extern	void		  sched_run	(void);

/*
 * tc.str.c:
 */
#ifdef WIDE_STRINGS
extern	size_t		  one_mbtowc	(Char *, const char *, size_t);
extern	size_t		  one_wctomb	(char *, Char);
extern  int		  rt_mbtowc	(Char *, const char *, size_t);
#else
#define one_mbtowc(PWC, S, N) \
	((void)(N), *(PWC) = (unsigned char)*(S), (size_t)1)
#define one_wctomb(S, WCHAR) (*(S) = (char)(WCHAR), (size_t)1)
#endif
#ifdef SHORT_STRINGS
extern	Char		 *s_strchr	(const Char *, int);
extern	Char		 *s_strrchr	(const Char *, int);
extern	Char		 *s_strcat	(Char *, const Char *);
# ifdef NOTUSED
extern	Char		 *s_strncat	(Char *, const Char *, size_t);
# endif /* NOTUSED */
extern	Char		 *s_strcpy	(Char *, const Char *);
extern	Char		 *s_strncpy	(Char *, const Char *, size_t);
extern	Char		 *s_strspl	(const Char *, const Char *);
extern	size_t		  s_strlen	(const Char *);
extern	int		  s_strcmp	(const Char *, const Char *);
extern	int		  s_strncmp	(const Char *, const Char *, size_t);
extern	int		  s_strcasecmp	(const Char *, const Char *);
extern	Char		 *s_strnsave	(const Char *, size_t);
extern	Char		 *s_strsave	(const Char *);
extern	Char		 *s_strend	(const Char *);
extern	Char		 *s_strstr	(const Char *, const Char *);
extern	Char		 *str2short	(const char *);
extern	Char		**blk2short	(char **);
extern	char		 *short2str	(const Char *);
extern	char		**short2blk	(Char **);
#else /* !SHORT_STRINGS */
extern	char		 *caching_strip	(const char *);
#endif
extern	char		 *short2qstr	(const Char *);

extern  struct blk_buf   *bb_alloc	(void);
extern	void		  bb_append	(struct blk_buf *, Char *);
extern	void		  bb_cleanup	(void *);
extern	Char		**bb_finish	(struct blk_buf *);
extern  void 		  bb_free	(void *);

extern	struct strbuf	 *strbuf_alloc(void);
extern	void		  strbuf_terminate(struct strbuf *);
extern  void		  strbuf_append1(struct strbuf *, char);
extern  void		  strbuf_appendn(struct strbuf *, const char *,
					 size_t);
extern  void		  strbuf_append (struct strbuf *, const char *);
extern  char		 *strbuf_finish (struct strbuf *);
extern	void		  strbuf_cleanup(void *);
extern	void		  strbuf_free(void *);
extern	struct Strbuf	 *Strbuf_alloc(void);
extern	void		  Strbuf_terminate(struct Strbuf *);
extern  void		  Strbuf_append1(struct Strbuf *, Char);
extern  void		  Strbuf_appendn(struct Strbuf *, const Char *,
					 size_t);
extern  void		  Strbuf_append (struct Strbuf *, const Char *);
extern  Char		 *Strbuf_finish (struct Strbuf *);
extern	void		  Strbuf_cleanup(void *);
extern	void		  Strbuf_free(void *);


/*
 * tc.vers.c:
 */
extern	void		  fix_version	(void);

/*
 * tc.who.c
 */
#if defined (HAVE_UTMP_H) || defined (HAVE_UTMPX_H) || defined (WINNT_NATIVE)
extern	void		  initwatch	(void);
extern	void		  resetwatch	(void);
extern	void		  watch_login	(int);
extern	char	 	 *who_info	(ptr_t, int);
extern	void		  dolog		(Char **, struct command *);
# ifdef HAVE_STRUCT_UTMP_UT_HOST
extern	char		 *utmphost	(void);
extern	size_t		  utmphostsize	(void);
# endif /* HAVE_STRUCT_UTMP_UT_HOST */
#else
# define HAVENOUTMP
#endif

#endif /* _h_tc_decls */
