Skip to content
builtin_source.c 1.24 KiB
Newer Older
Seblu's avatar
Seblu committed
/*
Seblu's avatar
Seblu committed
** builtin_source.c for 42sh
Seblu's avatar
Seblu committed
**
** Made by Seblu
Seblu's avatar
Seblu committed
** Login   <seblu@epita.fr>
Seblu's avatar
Seblu committed
**
** Started on  Sun Apr  9 04:40:11 2006 Seblu
Seblu's avatar
Seblu committed
** Last update Fri Nov 17 13:03:34 2006 seblu
Seblu's avatar
Seblu committed
*/

#include <stdio.h>
#include <assert.h>
#include "builtin.h"
#include "../main/42sh.h"
#include "../execution/execution.h"

static int		builtin_source_error(int err);

Seblu's avatar
Seblu committed
int			builtin_source(char *argv[])
Seblu's avatar
Seblu committed
{
   FILE			*fd;
   int			yyparse();
   void			scan_switch_buffer(FILE *fd);
   int			scanerr = 0;
   int			parseerr = 0;
   struct s_42sh	tempsh;

   assert(argv && sh);
   if (!argv[1])
      return builtin_source_error(2);
   else if (!(fd = fopen(argv[1], "r")))
      return builtin_source_error(1);
   /* FIXME: call gerlic */
   scan_switch_buffer(fd);
   parseerr = yyparse("source: ", &scanerr, &tempsh);
   if (scanerr)
      return builtin_source_error(SCAN_ERROR);
   if (parseerr)
      return builtin_source_error(PARSE_ERROR);
   fclose(fd);
   scan_switch_buffer(NULL);
   exec_start(&tempsh);
   /* FIXME: ast destruction */
   return tempsh.last_status;
   sh = sh;
}

static int		builtin_source_error(int err)
{
   if (err == 1)
      perror("42sh: source");
   else if (err == 2)
      fprintf(stderr, "42sh: source: filename argument required\n");
   return 1;
}