void check() const { if (spectralFilenames.size() == 0) g_argerr("There must be at least one spectral file."); if (indexFilename.empty()) g_argerr("The index filename must be given."); if (outputFilename.empty()) g_argerr("The output filename must be given."); if (srid == 0) g_warn("The SRID is zero."); if(hasIdxNodata) g_warn("The index file null value is not set."); if(hasSpecNodata) g_warn("The spectral file null value is not set."); }
void xx_warn( const msg_ids errid ) { wng_count++; g_warn( errid ); file_mac_info(); return; }
void dc_opt_warn( char *pa ) { wng_count++; g_warn( err_dc_opt, pa ); file_mac_info(); show_line_error( pa ); return; }
static void var_wng( char * varname, symvar *e ) { if( !ProcFlags.no_var_impl_err ) { // for full dict print no err msg e->varfunc = NULL; // deactivate after first warning wng_count++; g_warn( err_var_not_impl, varname ); file_mac_info(); } return; }
static char *scr_single_func_unsupport( char * in, char * * result ) { char charstr[2]; result = result; charstr[0] = *(in + 1); charstr[1] = '\0'; g_warn( wng_func_unsupport, charstr ); g_info_inp_pos(); // do nothing return( in + 3 ); }
static char *scr_single_func_unsupport( char * in, char * * result ) { char linestr[MAX_L_AS_STR]; char charstr[2]; result = result; charstr[0] = *(in + 1); charstr[1] = '\0'; g_warn( wng_func_unsupport, charstr ); if( input_cbs->fmflags & II_macro ) { ultoa( input_cbs->s.m->lineno, linestr, 10 ); g_info( inf_mac_line, linestr, input_cbs->s.m->mac->name ); } else { ultoa( input_cbs->s.f->lineno, linestr, 10 ); g_info( inf_file_line, linestr, input_cbs->s.f->filename ); } // do nothing return( in + 3 ); }
char * get_refid_value( char * p ) { char * pa; char * pe; int len; char c; p = get_att_value( p ); if( val_start == NULL || val_len == 0 ) { // no valid id return( p ); } pa = val_start; while( is_id_char( *pa ) ) { pa++; } len = pa - val_start; pe = val_start + len; if( len > 7 ) { // wgml 4 warning level c = *pe; *pe = '\0'; g_warn( wng_id_xxx, val_start ); *pe = c; g_info( inf_id_len ); file_mac_info(); wng_count++; } /***************************************************************/ /* restrict the length to ID_LEN (15) in the hope that no */ /* truncation occurs */ /* wgml4 warns about ids of more than 7 chars, but processes */ /* much longer ids TBD */ /***************************************************************/ val_len = min( ID_LEN, len ); // restrict length *(val_start + val_len) = '\0'; return( p ); }
void scr_label( void ) { condcode cc; getnum_block gn; labelcb * lb; char linestr[MAX_L_AS_STR]; scan_start += 2; // over dots while( *scan_start == ' ' ) { // may be ...LABEL or ... LABEL scan_start++; // over blanks } if( *scan_start == '\0' ) { // no label? scan_err = true; err_count++; g_err( err_missing_name, "" ); if( input_cbs->fmflags & II_tag_mac ) { utoa( input_cbs->s.m->lineno, linestr, 10 ); g_info( inf_mac_line, linestr, input_cbs->s.m->mac->name ); } else { utoa( input_cbs->s.f->lineno, linestr, 10 ); g_info( inf_file_line, linestr, input_cbs->s.f->filename ); } show_include_stack(); return; } else { gn.argstart = scan_start; gn.argstop = scan_stop; gn.ignore_blanks = 0; cc = getnum( &gn ); // try numeric expression evaluation if( cc == pos ) { // numeric linenumber scan_start = gn.argstart; // start for next token // check if lineno from label matches actual lineno if( input_cbs->fmflags & II_tag_mac ) { if( gn.result != input_cbs->s.m->lineno ) { scan_err = true; err_count++; g_err( err_label_line, gn.resultstr ); utoa( input_cbs->s.m->lineno, linestr, 10 ); g_info( inf_mac_line, linestr, input_cbs->s.m->mac->name ); show_include_stack(); return; } } else { if( gn.result != input_cbs->s.f->lineno ) { scan_err = true; err_count++; g_err( err_label_line, gn.resultstr ); utoa( input_cbs->s.f->lineno, linestr, 10 ); g_info( inf_file_line, linestr, input_cbs->s.f->filename ); show_include_stack(); return; } } if( input_cbs->fmflags & II_tag_mac ) { // numeric macro label no need to store } else { wng_count++; g_warn( wng_label_num ); utoa( input_cbs->s.f->lineno, linestr, 10 ); g_info( inf_file_line, linestr, input_cbs->s.f->filename ); show_include_stack(); } } else { // no numeric label cc = getarg(); if( cc == pos ) { // label name specefied char * p; char * pt; int len; p = tok_start; pt = token_buf; len = 0; while( len < arg_flen ) { // copy to buffer *pt++ = *p++; len++; } *pt = '\0'; if( len > MAC_NAME_LENGTH ) { err_count++; g_err( err_sym_long, token_buf ); utoa( input_cbs->s.f->lineno, linestr, 10 ); g_info( inf_file_line, linestr, input_cbs->s.f->filename ); show_include_stack(); token_buf[MAC_NAME_LENGTH] = '\0'; } if( input_cbs->fmflags & II_tag_mac ) { cc = test_duplicate( token_buf, input_cbs->s.m->lineno ); if( cc == pos ) { // ok name and lineno match // nothing to do } else { if( cc == neg ) { // name with different lineno scan_err = true; err_count++; g_err( err_label_dup, token_buf ); utoa( input_cbs->s.m->lineno, linestr, 10 ); g_info( inf_mac_line, linestr, input_cbs->s.m->mac->name ); show_include_stack(); return; } else { // new label lb = mem_alloc( sizeof( labelcb ) ); lb->prev = input_cbs->s.m->mac->label_cb; input_cbs->s.m->mac->label_cb = lb; lb->pos = 0; lb->lineno = input_cbs->s.m->lineno; strcpy_s( lb->label_name, sizeof( lb->label_name ), token_buf ); } } } else { cc = test_duplicate( token_buf, input_cbs->s.f->lineno ); if( cc == pos ) { // ok name and lineno match // nothing to do } else { if( cc == neg ) { // name with different lineno scan_err = true; err_count++; g_err( err_label_dup, token_buf ); utoa( input_cbs->s.f->lineno, linestr, 10 ); g_info( inf_file_line, linestr, input_cbs->s.f->filename ); show_include_stack(); return; } else { // new label lb = mem_alloc( sizeof( labelcb ) ); lb->prev = input_cbs->s.f->label_cb; input_cbs->s.f->label_cb = lb; lb->pos = input_cbs->s.f->pos; lb->lineno = input_cbs->s.f->lineno; strcpy_s( lb->label_name, sizeof( lb->label_name ), token_buf ); } } } } else { scan_err = true; err_count++; g_err( err_missing_name, "" ); if( input_cbs->fmflags & II_tag_mac ) { utoa( input_cbs->s.m->lineno, linestr, 10 ); g_info( inf_mac_line, linestr, input_cbs->s.m->mac->name ); } else { utoa( input_cbs->s.f->lineno, linestr, 10 ); g_info( inf_file_line, linestr, input_cbs->s.f->filename ); } show_include_stack(); return; } } if( *scan_start == ' ' ) { scan_start++; // skip one blank if( *scan_start ) { // rest of line is not empty split_input( buff2, scan_start, false );// split and process next } } scan_restart = scan_stop + 1; return; } }
bool process_tag( gtentry * ge, mac_entry * me ) { bool processed; gaentry * ga; gavalentry * gaval; char * p; char * p2; int rc; char quote; char longwork[20]; bool tag_end_found = false; processed = true; init_dict( &loc_dict ); add_defaults_to_dict( ge, &loc_dict ); /***********************************************************************/ /* scan input for attributes and / or tagtext */ /***********************************************************************/ p = tok_start + ge->namelen + 1; // over tagname if( ge->attribs != NULL ) { // only process attributes if they exist while( *p == ' ' ) { // not yet end of tag, process attributes while( *p == ' ' ) { // over WS to attribute p++; } if( *p == '.' ) { tag_end_found = true; break; } p2 = token_buf; while( is_id_char( *p ) ) { *p2++ = *p++; } *p2 = '\0'; if( p2 != token_buf ) { // ignore nullstring for( ga = ge->attribs; ga != NULL; ga = ga->next ) {// all attrs if( !stricmp( ga->name, token_buf ) ) { ga->attflags |= att_proc_seen; // attribute specified if( ga->attflags & att_auto ) { auto_att_err(); break; } if( *p == '=' ) { // value follows ga->attflags |= att_proc_val; p++; // over = p2 = token_buf; if( is_quote_char( *p ) ) { quote = *p++; while( *p && *p != quote ) {// quoted value *p2++ = *p++; } if( *p == quote ) { p++;// over ending quote } } else { quote = '\0'; while( *p && (*p != ' ') && (*p != '.') ) { *p2++ = *p++; } } *p2 = '\0'; if( ga->attflags & att_off ) {// attribute inactive continue; } if( ga->attflags & att_upper ) {// uppercase option strupr( token_buf ); } scan_err = check_att_value( ga ); } else {// special for range set default2 if no value if( ga->attflags & att_range ) { for( gaval = ga->vals; gaval != NULL; gaval = gaval->next ) { if( gaval->valflags & val_range ) { break; } } if( gaval != NULL ) { sprintf( token_buf, "%d", gaval->a.range[3] ); rc = add_symvar( &loc_dict, ga->name, token_buf, no_subscript, local_var ); } } } break; } } if( ga == NULL ) { // attribute Not found char linestr[MAX_L_AS_STR]; processed = false; wng_count++; //***WARNING*** SC--040: 'abd' is not a valid attribute name g_warn( wng_att_name, token_buf ); if( input_cbs->fmflags & II_macro ) { ultoa( input_cbs->s.m->lineno, linestr, 10 ); g_info( inf_mac_line, linestr, input_cbs->s.m->mac->name ); } else { ultoa( input_cbs->s.f->lineno, linestr, 10 ); g_info( inf_file_line, linestr, input_cbs->s.f->filename ); } show_include_stack(); } } /***************************************************************/ /* check for tag end . */ /***************************************************************/ if( *p == ' ' ) { continue; // not yet at buffer / tag end } #if 0 /***************************************************************/ /* continue scanning for attriutes on next line if not tag end*/ /* This does not work for constructs such as */ /* */ /* :hdref refid=diffs */ /* .bd to determine if you need to recompile your application.*/ /* from docs\doc\gs\intro.gml line 37 f */ /***************************************************************/ if( *p != '.' ) { // if( get_line( true ) ) { p = buff2; } else { *p = '\0'; } } else { tag_end_found = true; } #else if( (*p == '.') || (*p == '\0') ) { tag_end_found = true; } #endif } /*******************************************************************/ /* check for missing reqrd attributes */ /*******************************************************************/ *token_buf = '\0'; for( ga = ge->attribs; ga != NULL; ga = ga->next ) {// for all attrs if( ga->attflags & att_req ) { if( !(ga->attflags & att_proc_seen) ) { if( *token_buf != '\0' ) { strcat( token_buf, " '" ); } else { strcpy( token_buf, "'" ); } strcat( token_buf, ga->name ); strcat( token_buf, "' " ); } } } if( *token_buf != '\0' ) { // some req attr missing char linestr[MAX_L_AS_STR]; // the errmsg in wgml 4.0 is wrong, it shows the macroname, not tag. // ****ERROR**** SC--047: For the tag '@willi', the required attribute(s) // 'muss2' // 'muss' // have not been specified processed = false; err_count++; g_err( err_att_req, ge->name, token_buf ); if( input_cbs->fmflags & II_macro ) { ultoa( input_cbs->s.m->lineno, linestr, 10 ); g_info( inf_mac_line, linestr, input_cbs->s.m->mac->name ); } else { ultoa( input_cbs->s.f->lineno, linestr, 10 ); g_info( inf_file_line, linestr, input_cbs->s.f->filename ); } show_include_stack(); } if( *p == '.' ) { // does text follow tag end if( strlen( p + 1 ) > 0 ) { if( ge->tagflags & tag_texterr ) { // no text allowed tag_text_err( ge->name ); processed = false; } } else { if( ge->tagflags & tag_textreq ) { // reqrd text missing tag_text_req_err( ge->name ); processed = false; } } strcpy( token_buf, p + 1 ); rc = add_symvar( &loc_dict, "_", token_buf, no_subscript, local_var ); p += strlen( token_buf ); } scan_start = p + 1; // all processed /*******************************************************************/ /* add standard symbols to dict */ /*******************************************************************/ rc = add_symvar( &loc_dict, "_tag", ge->name, no_subscript, local_var ); ge->usecount++; sprintf( longwork, "%d", ge->usecount ); rc = add_symvar( &loc_dict, "_n", longwork, no_subscript, local_var ); add_macro_cb_entry( me, ge ); // prepare GML macro as input input_cbs->local_dict = loc_dict; inc_inc_level(); // start new include level if( ge->tagflags & tag_cont ) { // +++++++++++++++++++ TBD trial post_space = 0; ProcFlags.ct = true; } if( input_cbs->fmflags & II_research && GlobalFlags.firstpass ) { print_sym_dict( input_cbs->local_dict ); } } else { // user-defined tag has no attributes if( ge->tagflags & tag_texterr ) { // no text allowed // '.' or CW_sep_char immediately after the tag does not count as text if( (*p == '.') || (*p == CW_sep_char ) ) { p++; } while( *p == ' ' ) { // spaces don't count as text p++; } if( *p ) { // text found tag_text_err( ge->name ); processed = false; return( processed ); } } if( ge->tagflags & tag_textreq ) { // text is required // per wgml 4.0 behavior if( *p == CW_sep_char ) { processed = false; return( processed ); } // '.' immediately after the tag does not count as text if( *p == '.' ) { p++; } while( *p == ' ' ) { // spaces don't count as text p++; } if( !*p ) { // no text found tag_text_req_err( ge->name ); processed = false; return( processed ); } } // per wgml 4.0 behavior if( *p == CW_sep_char ) { processed = false; return( processed ); } // '.' immediately after the tag is not passed to the macro if( *p == '.' ) { p++; } strcpy( token_buf, p ); rc = add_symvar( &loc_dict, "_", token_buf, no_subscript, local_var ); p += strlen( token_buf ); scan_start = p + 1; // all processed /*******************************************************************/ /* add standard symbols to dict */ /*******************************************************************/ rc = add_symvar( &loc_dict, "_tag", ge->name, no_subscript, local_var ); ge->usecount++; sprintf( longwork, "%d", ge->usecount ); rc = add_symvar( &loc_dict, "_n", longwork, no_subscript, local_var ); add_macro_cb_entry( me, ge ); // prepare GML macro as input input_cbs->local_dict = loc_dict; inc_inc_level(); // start new include level if( ge->tagflags & tag_cont ) { // +++++++++++++++++++ TBD trial post_space = 0; ProcFlags.ct = true; } if( input_cbs->fmflags & II_research && GlobalFlags.firstpass ) { print_sym_dict( input_cbs->local_dict ); } } return( processed ); }
extern void gml_xmp( const gmltag * entry ) { char * p; entry = entry; start_doc_sect(); scr_process_break(); scan_err = false; p = scan_start; if( *p == '.' ) { /* already at tag end */ } else { p++; while( *p == ' ' ) { p++; } if( !strnicmp( "depth=", p, 6 ) ) { p += 6; /***************************************************************/ /* Although unsupported, scan depth='xxx' */ /***************************************************************/ g_warn( wng_unsupp_att, "depth" ); wng_count++; file_mac_info(); while( *p && *p != '.' ) { // ignore all up to tag end p++; } } } if( ProcFlags.xmp_active ) { // nested :XMP tag not supported g_err_tag_nest( "eXMP" ); scan_start = scan_stop + 1; return; } /******************************************************************/ /* test for XMP within :ADDRESS, :FIG , :FN */ /******************************************************************/ if( ProcFlags.address_active ) { g_err_tag_x_in_y( "XMP", "ADDRESS" ); scan_start = scan_stop + 1; return; } else { if( ProcFlags.fig_active ) { g_err_tag_x_in_y( "XMP", "FIG" ); scan_start = scan_stop + 1; return; } else { if( ProcFlags.fn_active ) { g_err_tag_x_in_y( "XMP", "FN" ); scan_start = scan_stop + 1; return; } } } ProcFlags.xmp_active = true; first_xline = true; font_save = g_curr_font; g_curr_font = layout_work.xmp.font; if( nest_cb->c_tag == t_NONE ) { g_cur_left = g_page_left + conv_hor_unit( &layout_work.xmp.left_indent ); } else { g_cur_left += conv_hor_unit( &layout_work.xmp.left_indent ); } g_cur_h_start = g_cur_left; ProcFlags.keep_left_margin = true; // keep special indent init_nest_cb(); nest_cb->p_stack = copy_to_nest_stack(); nest_cb->c_tag = t_XMP; spacing = layout_work.xmp.spacing; set_skip_vars( NULL, &layout_work.xmp.pre_skip, NULL, spacing, g_curr_font ); ProcFlags.group_elements = true; justify_save = ProcFlags.justify; ProcFlags.justify = ju_off; // TBD if( *p == '.' ) p++; // possible tag end if( *p ) { process_text( p, g_curr_font ); // if text follows } scan_start = scan_stop + 1; return; }
void lasclip(std::string &outfile, std::string &shapefile, std::string &layername, std::vector<std::string> &files, std::set<int> &classes, bool quiet) { if (outfile.empty()) g_argerr("An output file is required."); if (shapefile.empty()) g_argerr("A shape file is required."); if (files.size() == 0) g_argerr("At least one input file is required."); if (classes.size() == 0) g_warn("No classes specified, matching all classes."); /* Attempt to open and load geometries from the shape file. */ OGRRegisterAll(); OGRLayer *layer; OGRFeature *feat; OGRGeometry *og; OGRwkbGeometryType type; gg::GeometryCollection *geomColl; gg::Geometry *geom; OGRDataSource *ds = OGRSFDriverRegistrar::Open(shapefile.c_str(), FALSE); if (ds == nullptr) g_runerr("Couldn't open shapefile."); if (layername.empty()) { layer = ds->GetLayer(0); } else { layer = ds->GetLayerByName(layername.c_str()); } if (layer == nullptr) g_runerr("Couldn't get layer."); type = layer->GetGeomType(); if (type != wkbPolygon && type != wkbMultiPolygon) g_runerr("Geometry must be polygon or multipolygon."); const GEOSContextHandle_t gctx = OGRGeometry::createGEOSContext(); const gg::GeometryFactory *gf = gg::GeometryFactory::getDefaultInstance(); const gg::CoordinateSequenceFactory *cf = gf->getCoordinateSequenceFactory(); std::vector<gg::Geometry *> geoms; while ((feat = layer->GetNextFeature()) != NULL) { og = feat->GetGeometryRef(); geom = (gg::Geometry *) og->exportToGEOS(gctx); geoms.push_back(geom); } GDALClose(ds); if (geoms.size() == 0) g_runerr("No geometries were found."); /* The geometry collection is used for checking whether a las file intersects the region of interest. */ geomColl = gf->createGeometryCollection(geoms); const gg::Envelope *env = geomColl->getEnvelopeInternal(); Bounds cbounds(env->getMinX(), env->getMinY(), env->getMaxX(), env->getMaxY()); /* Loop over files and figure out which ones are relevant. */ liblas::ReaderFactory rf; liblas::Header *dsth = nullptr; std::vector<unsigned int> indices; for (unsigned int i = 0; i < files.size(); ++i) { std::ifstream in(files[i].c_str(), std::ios::in | std::ios::binary); liblas::Reader r = rf.CreateWithStream(in); liblas::Header h = r.GetHeader(); if (i == 0) dsth = new liblas::Header(h); std::vector<gg::Coordinate> coords; coords.push_back(gg::Coordinate(h.GetMinX(), h.GetMinY())); coords.push_back(gg::Coordinate(h.GetMaxX(), h.GetMinY())); coords.push_back(gg::Coordinate(h.GetMaxX(), h.GetMaxY())); coords.push_back(gg::Coordinate(h.GetMinX(), h.GetMaxY())); coords.push_back(gg::Coordinate(h.GetMinX(), h.GetMinY())); gg::CoordinateSequence *cs = cf->create(&coords); gg::LinearRing *lr = gf->createLinearRing(cs); gg::Polygon *bounds = gf->createPolygon(lr, NULL); if (bounds->intersects(geomColl)) indices.push_back(i); in.close(); } if (indices.size() == 0) g_runerr("No files matched the given bounds."); std::ofstream out(outfile, std::ios::out | std::ios::binary); liblas::WriterFactory wf; liblas::Writer w(out, *dsth); liblas::Header::RecordsByReturnArray recs; int count = 0; double bounds[] = { G_DBL_MAX_POS, G_DBL_MAX_NEG, G_DBL_MAX_POS, G_DBL_MAX_NEG, G_DBL_MAX_POS, G_DBL_MAX_NEG }; g_trace("Using points from " << indices.size() << " files."); for (int i = 0; i < 5; ++i) recs.push_back(0); for (unsigned int i = 0; i < indices.size(); ++i) { std::ifstream in(files[indices[i]].c_str(), std::ios::in | std::ios::binary); liblas::Reader r = rf.CreateWithStream(in); liblas::Header h = r.GetHeader(); g_trace("Processing file " << files[indices[i]]); while (r.ReadNextPoint()) { liblas::Point pt = r.GetPoint(); int cls = pt.GetClassification().GetClass(); if (classes.size() > 0 && !Util::inList(classes, cls)) continue; double x = pt.GetX(); double y = pt.GetY(); const gg::Coordinate c(x, y); gg::Point *p = gf->createPoint(c); if (cbounds.contains(x, y) && geomColl->contains(p)) { ++recs[cls]; ++count; w.WritePoint(pt); if (pt.GetX() < bounds[0]) bounds[0] = pt.GetX(); if (pt.GetX() > bounds[1]) bounds[1] = pt.GetX(); if (pt.GetY() < bounds[2]) bounds[2] = pt.GetY(); if (pt.GetY() > bounds[3]) bounds[3] = pt.GetY(); if (pt.GetZ() < bounds[4]) bounds[4] = pt.GetZ(); if (pt.GetZ() > bounds[5]) bounds[5] = pt.GetZ(); } } in.close(); } // Set the total count and update the point record counts. dsth->SetMin(bounds[0], bounds[2], bounds[4]); dsth->SetMax(bounds[1], bounds[3], bounds[5]); dsth->SetPointRecordsCount(count); for (unsigned int i = 0; i < recs.size(); ++i) dsth->SetPointRecordsByReturnCount(i, recs[i]); w.WriteHeader(); }
static void gml_hx_common( gml_tag gtag, int hx_lvl ) { char * p; char * headp; bool idseen; bool stitleseen; int rc; int k; size_t headlen; size_t txtlen; char hnumstr[64]; ref_entry * re; ref_entry * rwk; static char hxstr[4] = ":HX"; static char htextx[8] = "$htextX"; static char headx[7] = "$headX"; gtag = gtag; *(hxstr + 2) = '0' + hx_lvl; htextx[6] = '0' + hx_lvl; hnumx[5] = '0' + hx_lvl; headx[5] = '0' + hx_lvl; switch( hx_lvl ) { case 0: if( !((ProcFlags.doc_sect == doc_sect_body) || (ProcFlags.doc_sect_nxt == doc_sect_body)) ) { g_err( err_tag_wrong_sect, hxstr, ":BODY section" ); err_count++; file_mac_info(); } break; case 1: if( !((ProcFlags.doc_sect >= doc_sect_body) || (ProcFlags.doc_sect_nxt >= doc_sect_body)) ) { g_err( err_tag_wrong_sect, hxstr, ":BODY :APPENDIX :BACKM sections" ); err_count++; file_mac_info(); } break; default: if( !((ProcFlags.doc_sect >= doc_sect_abstract) || (ProcFlags.doc_sect_nxt >= doc_sect_abstract)) ) { g_err( err_tag_wrong_sect, hxstr, ":ABSTRACT section or later" ); err_count++; file_mac_info(); } break; } if( layout_work.hx[hx_lvl].number_form != num_none ) { layout_work.hx[hx_lvl].headn++; } idseen = false; stitleseen = false; p = scan_start; re = NULL; /***********************************************************************/ /* Scan attributes for :Hx */ /* id= */ /* stitle= */ /***********************************************************************/ for( ;; ) { while( *p == ' ' ) { p++; } if( *p == '\0' || *p == '.' ) { break; // tag end found } if( !strnicmp( "stitle=", p, 7 ) ) { p += 6; stitleseen = true; /***************************************************************/ /* Although unsupported scan stitle='xxx' */ /***************************************************************/ g_warn( wng_unsupp_att, "stitle" ); wng_count++; file_mac_info(); p = get_att_value( p ); scan_start = p; if( !ProcFlags.tag_end_found ) { continue; } break; } /*******************************************************************/ /* ID='xxxxxxxx' */ /*******************************************************************/ if( !strnicmp( "id=", p, 3 ) ) { p += 2; p = get_refid_value( p ); if( val_len > 0 ) { idseen = true; // valid id attribute found *(val_start + val_len) = '\0'; if( re == NULL ) { // prepare reference entry re = mem_alloc( sizeof( ref_entry ) ); init_ref_entry( re, val_start, val_len ); } else { fill_id( re, val_start, val_len ); } } scan_start = p; if( !ProcFlags.tag_end_found ) { continue; } break; } /*******************************************************************/ /* no more valid attributes, process remaining input as header text*/ /*******************************************************************/ break; } if( *p == '.' ) { // tag end ? p++; } /************************************************************************/ /* set the global vars $headx, $headnumx, $htextx */ /* perhaps text translated to upper or lower case */ /************************************************************************/ while( *p == ' ' ) { // ignore leading blanks p++; } if( *p ) { // text exists if( layout_work.hx[hx_lvl].cases == case_lower ) { strlwr( p ); } else if( layout_work.hx[hx_lvl].cases == case_upper ) { strupr( p ); } } rc = add_symvar( &global_dict, htextx, p, no_subscript, 0 ); update_headnumx( hx_lvl, hnumstr, sizeof( hnumstr ) ); txtlen = strlen( p ); headlen = strlen( hnumstr) + txtlen + 2; headp = mem_alloc( headlen ); if( layout_work.hx[hx_lvl].number_form != num_none ) { strcpy( headp, hnumstr); // numbered header strcat( headp, " " ); } else { *headp = '\0'; } strcat( headp, p ); rc = add_symvar( &global_dict, headx, headp, no_subscript, 0 ); out_msg( " %s\n", headp ); // always verbose output ? TBD mem_free( headp ); /***********************************************************************/ /* if id specified add it to reference dict */ /***********************************************************************/ if( idseen ) { rwk = find_refid( ref_dict, re->id ); if( !rwk ) { // new entry if( txtlen > 0 ) { // text line not empty re->u.info.text_cap = mem_alloc( txtlen + 1 ); strcpy( re->u.info.text_cap, p ); } add_ref_entry( &ref_dict, re ); re = NULL; // free will be done via dictionary } else { /***************************************************************/ /* test for duplicate id */ /* it is done with comparing line no only, in the hope that */ /* two identical ids are not specified in different files on */ /* the same line no. */ /***************************************************************/ if( re->lineno != rwk->lineno ) { g_err( wng_id_xxx, re->id ); g_info( inf_id_duplicate ); file_mac_info(); err_count++; } if( re->u.info.text_cap != NULL ) { mem_free( re->u.info.text_cap ); } mem_free( re ); } } if( layout_work.hx[hx_lvl].number_reset ) { for( k = hx_lvl + 1; k < 7; k++ ) { layout_work.hx[k].headn = 0;// reset following levels if( layout_work.hx[k].headnsub != NULL ) { *(layout_work.hx[k].headnsub->value) = '\0'; } } } /***********************************************************************/ /* creation of actual heading */ /***********************************************************************/ /***********************************************************************/ /* eject page(s) if specified */ /***********************************************************************/ if( layout_work.hx[hx_lvl].page_eject != ej_no ) { if( ProcFlags.page_started ) { do_page_out(); reset_t_page(); } if( !ProcFlags.start_section ) { start_doc_sect(); } set_headx_banners( hx_lvl ); // set possible banners reset_t_page(); // and adjust page margins if( (layout_work.hx[hx_lvl].page_eject == ej_odd) && (page & 1) ) { do_page_out(); // next page would be even reset_t_page(); } else if( (layout_work.hx[hx_lvl].page_eject == ej_even) && !(page & 1) ) { do_page_out(); // next page would be odd reset_t_page(); } } if( layout_work.hx[hx_lvl].display_heading ) { hx_header( hx_lvl, hnumstr, p ); } scan_start = scan_stop; return; }
void gml_hdref( const gmltag * entry ) { char * p; char * pa; char * pe; char * idp; char quote; char c; bool idseen; bool pageseen; bool withpage; size_t len; char buf64[64]; ref_entry * re; static char undefid[] = "\"Undefined Heading\" on page XXX"; idseen = false; pageseen = false; withpage = false; p = scan_start; re = NULL; /***********************************************************************/ /* Scan attributes for :HDREF */ /* id= */ /* page= */ /***********************************************************************/ for( ;; ) { while( *p == ' ' ) { p++; } if( *p == '\0' || *p == '.' ) { break; // tag end found } if( !strnicmp( "page=", p, 5 ) ) { p += 5; while( *p == ' ' ) { p++; } pa = p; if( !strnicmp( "yes", p, 3 ) ) { pageseen = true; withpage = true; p += 3; } else { if( !strnicmp( "no", p, 2 ) ) { pageseen = true; withpage = false; p += 2; } else { g_err( err_inv_att_val ); file_mac_info(); err_count++; while( *p && (*p != '.') && (*p != ' ') ) p++; } } scan_start = p; continue; } if( !strnicmp( "refid=", p, 6 ) ) { p += 6; while( *p == ' ' ) { p++; } if( is_quote_char( *p ) ) { quote = *p; p++; } else { quote = '\0'; } pa = p; while( *p && is_id_char( *p ) ) { p++; } len = __min( ID_LEN, p - pa );// restrict length as in ghx.c if( len > 0 ) { idseen = true; // valid id attribute found pe = pa + len; c = *pe; *pe = '\0'; re = find_refid( ref_dict, strlwr( pa ) ); if( re != NULL ) { // id found in ref dict idp = mem_alloc( 4 + strlen( re->text_cap ) ); *idp = '"'; // decorate with quotes strcpy( idp + 1, re->text_cap ); strcat( idp, "\"" ); } else { if( GlobalFlags.lastpass ) { g_warn( wng_id_xxx, pa ); g_info( inf_id_unknown ); file_mac_info(); wng_count++; } } *pe = c; } if( *p && (quote == *p) ) { p++; } scan_start = p; continue; } /*******************************************************************/ /* no more valid attributes */ /*******************************************************************/ break; } if( *p == '.' ) { // tag end ? p++; } if( idseen ) { // id attribute was specified bool concatsave = ProcFlags.concat; ProcFlags.concat = true; // make process_text add to line if( re == NULL ) { // undefined refid process_text( undefid, g_curr_font_num ); } else { process_text( idp, g_curr_font_num ); if( withpage || (!pageseen && (page != re->pageno)) ) { sprintf_s( buf64, sizeof( buf64 ), "on page %d", re->pageno ); process_text( buf64, g_curr_font_num ); } mem_free( idp ); } ProcFlags.concat = concatsave; } else { g_err( err_att_missing ); // id attribute missing file_mac_info(); err_count++; } scan_start = p; return; }