mirror of https://github.com/ecmwf/eccodes.git
146 lines
4.0 KiB
Modula-2
146 lines
4.0 KiB
Modula-2
# (C) Copyright 2005- ECMWF.
|
|
|
|
constant normal="NORMAL";
|
|
constant correction="CORRECTION";
|
|
#meta out sprintf("metar_%s.xml",count);
|
|
|
|
alias temperatureAndDewpointPresent=zero;
|
|
alias qnhPresent=zero;
|
|
alias qnhAPresent=zero;
|
|
alias qfePresent=zero;
|
|
alias status=normal;
|
|
alias isCorrection=zero;
|
|
alias presentTrend1=zero;
|
|
alias presentTrend2=zero;
|
|
alias presentTrend3=zero;
|
|
alias isAuto=false;
|
|
alias windPresent=zero;
|
|
alias nosigPresent=zero;
|
|
|
|
position startOfMessage;
|
|
message_copy theMessage :dump ;
|
|
|
|
group identifier; non_alpha na;
|
|
|
|
group g : dump; non_alpha na;
|
|
|
|
if ( g is "COR" ) {
|
|
rename(g,cor);
|
|
alias isCorrection=one;
|
|
alias status=correction;
|
|
group g : dump; non_alpha na;
|
|
}
|
|
if (length(g) == 4) {
|
|
include "metar/cccc.def";
|
|
} else {
|
|
if (g is "METAR") {
|
|
rename(g,metarTwice);
|
|
group g : dump; non_alpha na;
|
|
if (length(g) == 4) { include "metar/cccc.def"; }
|
|
else {
|
|
constant CCCC = "unknown";
|
|
constant coordinatesPresent = 0;
|
|
}
|
|
} else {
|
|
constant CCCC = "unknown";
|
|
constant coordinatesPresent = 0;
|
|
}
|
|
}
|
|
|
|
if (substr(g,6,1) is "Z" && is_integer(g,0,6) ) {
|
|
rename(g,YYGGgg);
|
|
modify YYGGgg : hidden;
|
|
group g : dump ; non_alpha na;
|
|
year=getenv("METAR_YEAR") : dump;
|
|
month=getenv("METAR_MONTH") : dump;
|
|
day = to_string(YYGGgg,0,2) : dump;
|
|
hour = to_string(YYGGgg,2,2) : dump;
|
|
minute = to_string(YYGGgg,4,2) : dump;
|
|
}
|
|
|
|
if ( ! isCorrection && g is "COR" ) {
|
|
rename(g,cor);
|
|
alias status=correction;
|
|
alias isCorrection=one;
|
|
group g : dump; non_alpha na;
|
|
}
|
|
|
|
include "metar/wrong_delayed.def";
|
|
|
|
if ( g is "NIL" ) {
|
|
rename(g,nil); group g : dump;
|
|
} else {
|
|
if (g is "AUTO") {
|
|
rename(g,auto);
|
|
alias isAuto=true;
|
|
group g : dump; non_alpha na;
|
|
}
|
|
|
|
include "metar/wind.def";
|
|
include "metar/horizontalVisibility.def";
|
|
|
|
if ( ! isCavok ) {
|
|
include "metar/present_weather.def";
|
|
include "metar/clouds.def";
|
|
}
|
|
|
|
include "metar/missing_field.def";
|
|
include "metar/temperature.def";
|
|
include "metar/qnh.def";
|
|
include "metar/colour.def";
|
|
include "metar/recent_weather.def";
|
|
include "metar/wind_shear.def";
|
|
include "metar/sea_state.def";
|
|
template runwayState "metar/runwayState.def";
|
|
include "metar/trend1.def";
|
|
include "metar/trend2.def";
|
|
include "metar/trend3.def";
|
|
include "metar/trend4.def";
|
|
|
|
}
|
|
|
|
include "metar/remark.def";
|
|
|
|
if (length(g) == 0) {
|
|
modify g : hidden;
|
|
} else {
|
|
if ( ! remarkPresent) {
|
|
rename(g,skippedGroup);
|
|
group g : dump; non_alpha na;
|
|
include "metar/colour.def";
|
|
include "metar/recent_weather.def";
|
|
include "metar/wind_shear.def";
|
|
include "metar/sea_state.def";
|
|
template runwayState "metar/runwayState.def";
|
|
include "metar/temperature.def";
|
|
include "metar/qnh.def";
|
|
if (!presentTrend1) {
|
|
include "metar/trend1.def";
|
|
include "metar/trend2.def";
|
|
include "metar/trend3.def";
|
|
include "metar/trend4.def";
|
|
}
|
|
}
|
|
include "metar/remark.def";
|
|
if ( ! remarkPresent) {
|
|
if ( length(g) == 0) {
|
|
modify g : hidden;
|
|
} else {
|
|
rename(g,unknownGroup) ;
|
|
}
|
|
}
|
|
group notDecoded("=") : dump;
|
|
if (remarkPresent) {
|
|
rename(notDecoded,remark);
|
|
}
|
|
}
|
|
ascii[1] endMark :read_only ;
|
|
|
|
position totalLength;
|
|
position endOfMessage;
|
|
|
|
meta lengthOfMessage evaluate( endOfMessage-startOfMessage);
|
|
meta md5Headers md5(startOfMessage,lengthOfMessage);
|
|
|
|
alias ls.totalLength=totalLength;
|