#include <stdio.h>
#include <stdarg.h>
#ifdef OLD_PROJECTBUILDER_INTERFACE
#include <streams/streams.h>
#endif
#include "make.h"
#include <stdlib.h>
#include <string.h>
#include <mach/mach.h>
#include <mach/mach_init.h>
#if defined(__OPENSTEP__) || defined(__GONZO_BUNSEN_BEAKER__)
#include <servers/netname.h>
#else
#include <servers/bootstrap.h>
#endif
#include "as.h"
#include "input-scrub.h"
#include "messages.h"
int bad_error = 0;
int arch_multiple = 0;
#ifdef OLD_PROJECTBUILDER_INTERFACE
static int talking_to_ProjectBuilder = 0;
static NXStream *ProjectBuilder_stream = NULL;
static mach_port_t ProjectBuilder_port;
void
check_for_ProjectBuilder(void)
{
char *portName;
#if defined(__OPENSTEP__) || defined(__GONZO_BUNSEN_BEAKER__)
char *hostName;
hostName = getenv("MAKEHOST");
if(hostName == NULL)
hostName = "";
#endif
portName = getenv("MAKEPORT");
if(portName == NULL)
return;
#if defined(__OPENSTEP__) || defined(__GONZO_BUNSEN_BEAKER__)
if(netname_look_up(name_server_port, hostName, portName,
(int *)&ProjectBuilder_port) != KERN_SUCCESS)
return;
#else
if(bootstrap_look_up(bootstrap_port, portName,
(int *)&ProjectBuilder_port) != KERN_SUCCESS)
return;
#endif
if(ProjectBuilder_port == MACH_PORT_NULL)
return;
talking_to_ProjectBuilder = 1;
}
static
void
tell_ProjectBuilder(
int eventType)
{
char *fileName, *directory, *message;
int line, len, maxlen;
as_where_ProjectBuilder(&fileName, &directory, &line);
if(fileName == NULL)
fileName = "";
if(directory == NULL)
directory = "";
NXGetMemoryBuffer(ProjectBuilder_stream, &message, &len, &maxlen);
#ifndef __MACH30__
make_alert(ProjectBuilder_port,
eventType,
NULL, 0,
fileName, strlen(fileName)+1 > 1024 ? 1024 : strlen(fileName)+1,
directory, strlen(directory)+1 > 1024 ? 1024 : strlen(directory)+1,
line,
message, len+1 > 1024 ? 1024 : len+1);
#endif
NXSeek(ProjectBuilder_stream, 0, NX_FROMSTART);
}
#endif
static
const char *
architecture_banner(void)
{
#ifdef M68K
return("as: for architecture m68k\n");
#endif
#ifdef M88K
return("as: for architecture m88k\n");
#endif
#ifdef PPC
return("as: for architecture ppc\n");
#endif
#ifdef I860
return("as: for architecture i860\n");
#endif
#ifdef I386
return("as: for architecture i386\n");
#endif
#ifdef HPPA
return("as: for architecture hppa\n");
#endif
#ifdef SPARC
return("as: for architecture sparc\n");
#endif
}
static
void
print_architecture_banner(void)
{
static int printed = 0;
if(arch_multiple && !printed){
printf(architecture_banner());
#ifdef OLD_PROJECTBUILDER_INTERFACE
if(talking_to_ProjectBuilder)
NXPrintf(ProjectBuilder_stream, architecture_banner());
#endif
printed = 1;
}
}
void
as_warn(
const char *format,
...)
{
va_list ap;
if(!flagseen['W']){
print_architecture_banner();
bad_error = 1;
as_where();
va_start(ap, format);
vfprintf(stderr, format, ap);
fprintf(stderr, "\n");
#ifdef OLD_PROJECTBUILDER_INTERFACE
if(talking_to_ProjectBuilder){
NXVPrintf(ProjectBuilder_stream, format, ap);
NXPrintf(ProjectBuilder_stream, "\n");
tell_ProjectBuilder(1 );
}
#endif
va_end(ap);
}
}
void
as_warning(
const char *format,
...)
{
va_list ap;
if(!flagseen['W']){
print_architecture_banner();
as_where();
va_start(ap, format);
vfprintf(stderr, format, ap);
fprintf(stderr, "\n");
#ifdef OLD_PROJECTBUILDER_INTERFACE
if(talking_to_ProjectBuilder){
NXVPrintf(ProjectBuilder_stream, format, ap);
NXPrintf(ProjectBuilder_stream, "\n");
tell_ProjectBuilder(1 );
}
#endif
va_end(ap);
}
}
void
as_bad(
const char *format,
...)
{
va_list ap;
print_architecture_banner();
bad_error = 1;
as_where();
va_start(ap, format);
vfprintf(stderr, format, ap);
fprintf(stderr, "\n");
#ifdef OLD_PROJECTBUILDER_INTERFACE
if(talking_to_ProjectBuilder){
NXVPrintf(ProjectBuilder_stream, format, ap);
NXPrintf(ProjectBuilder_stream, "\n");
tell_ProjectBuilder(0 );
}
#endif
va_end(ap);
}
void
as_fatal(
const char *format,
...)
{
va_list ap;
print_architecture_banner();
bad_error = 1;
as_where();
va_start(ap, format);
fprintf (stderr, "FATAL:");
vfprintf(stderr, format, ap);
fprintf(stderr, "\n");
#ifdef OLD_PROJECTBUILDER_INTERFACE
if(talking_to_ProjectBuilder){
NXPrintf(ProjectBuilder_stream, "FATAL:");
NXVPrintf(ProjectBuilder_stream, format, ap);
NXPrintf(ProjectBuilder_stream, "\n");
tell_ProjectBuilder(0 );
}
#endif
va_end(ap);
exit(1);
}