X-Git-Url: https://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/8cb6370effd9f2dacc6dc9b662a43ea19ee637ac..HEAD:/src/out.c diff --git a/src/out.c b/src/out.c index 3183635..effa4d3 100644 --- a/src/out.c +++ b/src/out.c @@ -1,17 +1,44 @@ +/* + * GOB C Preprocessor + * Copyright (C) 1999,2000 the Free Software Foundation. + * Copyright (C) 2000 Eazel, Inc. + * Copyright (C) 2001-2011 George (Jiri) Lebl + * + * Author: George (Jiri) Lebl + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * USA. + */ + +#include #include #include #include -#include "out.h" - -extern FILE *out; -extern FILE *outh; +#include "main.h" -extern char *filename; -extern char *filebase; +#include "out.h" int outline = 1; +static gboolean in_out = TRUE; int outhline = 1; +static gboolean in_outh = TRUE; +int outphline = 1; +static gboolean in_outph = TRUE; + +extern char file_sep; static int strchrcnt(char *s, char c) @@ -24,49 +51,79 @@ strchrcnt(char *s, char c) } void -out_printf(FILE *fp,char *format,...) +out_printf(FILE *fp, const char *format,...) { va_list ap; char *s; - va_start(ap,format); - s = g_strdup_vprintf(format,ap); + if (no_write) + return; + + va_start(ap, format); + s = g_strdup_vprintf(format, ap); va_end(ap); if(fp == out) - outline += strchrcnt(s,'\n'); + outline += strchrcnt(s, '\n'); else if(fp == outh) - outhline += strchrcnt(s,'\n'); + outhline += strchrcnt(s, '\n'); + else if(fp == outph) + outphline += strchrcnt(s, '\n'); else g_assert_not_reached(); - fprintf(fp,"%s",s); + fprintf(fp, "%s", s); g_free(s); } void out_addline_infile(FILE *fp, int line) { - if(fp == out) + if(no_lines || no_write) + return; + + if(fp == out) { outline++; - else if(fp == outh) + in_out = FALSE; + } else if(fp == outh) { outhline++; - else + in_outh = FALSE; + } else if(fp == outph) { + outphline++; + in_outph = FALSE; + } else g_assert_not_reached(); - fprintf(fp,"#line %d \"%s\"\n",line,filename); + fprintf(fp, "#line %d \"%s\"\n", line, filename); } void out_addline_outfile(FILE *fp) { + if(no_lines || no_write) + return; + if(fp == out) { + if(in_out) return; outline++; - fprintf(fp,"#line %d \"%s.c\"\n",outline,filebase); + if(!for_cpp) + fprintf(fp,"#line %d \"%s.c\"\n",outline,filebase); + else + fprintf(fp,"#line %d \"%s.cc\"\n",outline,filebase); + in_out = TRUE; } else if(fp == outh) { + if(in_outh) return; outhline++; fprintf(fp,"#line %d \"%s.h\"\n",outhline,filebase); + in_outh = TRUE; + } else if(fp == outph) { + char sep[2] = {0,0}; + if(in_outph) return; + outphline++; + if (file_sep != 0) + sep[0] = file_sep; + fprintf(fp,"#line %d \"%s%sprivate.h\"\n",outphline,filebase,sep); + in_outph = TRUE; } else g_assert_not_reached(); - }