#!/usr/bin/perl -w
#
# GPSy拡張形式のウェイポイントをユーザメモデータに
# Nowral
# 01/3/22
#
$cd = 0x10000; # depth / color

# 出力ファイル準備
$0 =~ /^(.*:)/;
$newargv = $1 . "UserMemo.memo";
open(OUT, ">$newargv");
MacPerl::SetFileInfo('NMVU', 'TEXT', $newargv);

# ヘッダ出力
print OUT <<END_OF_HEADER;
;地図画像ビューア ユーザメモデータ
atr0= "GPS Waypoint Data" mark= 0
;
END_OF_HEADER

# データ読み込み
$oldargv = "";
$nw = 0;
$cid = -1;
while (<>) {
  if ($ARGV ne $oldargv) {
    $oldargv = $ARGV;
    ++$cid;
  }
  @ed = split("\t");
  next unless($ed[0] eq "W" || $ed[0] eq "Wx" || $ed[0] eq "wx");
# ウェイポイント
  $b = &gdms2deg($ed[5]);
  $l = &gdms2deg($ed[6]);
  print OUT "Name= ( \"", $ed[2],
   "\"  addr= ( ", &deg2vdms($b), " ", &deg2vdms($l),
   " )  atr= 0  offset= ( 0 0 ) font= \"Osaka\" size= 14",
   " face= ( normal ) color= ( ", &penprop($cid), " ) )",
   "   Memo= ( \"", $ed[3], "\" )\n";
  ++$nw;
}
close(OUT);
print "# ウェイポイントデータ数: $nw\n";

# ユーザデータユティリティ起動 > うまくいったらテキストファイル削除
if($nw) {
  MacPerl::DoAppleScript(<<END_OF_SCRIPT) && unlink $newargv;
tell application "Finder" to open alias "$newargv"
END_OF_SCRIPT
}
print " ... done\n";

MacPerl::Quit(2);
die "The Unhappy End";

sub penprop { # 番号 -> 色
  my($id) = @_;
  my($cb, $cr, @cs);
  $id *= 65;
  $cb = int(($id+60) / 120);
  $cr = ($id/120-$cb) * $cd;
  $cs[$cb%3] = $cd - 1;
  ($cs[($cb+1)%3], $cs[($cb+2)%3]) = $cr>0 ? ($cr, 0) : (0, -$cr);
  return sprintf("%d %d %d", @cs);
}

sub deg2vdms { # 経緯度、度 -> dd.mm.ss.s形式
  my($d) = @_;
  my($m, $s, $sf);
  $sf = int($d*36000 + 0.5);
  $s = int($sf/10) % 60;
  $m = int($sf/600) % 60;
  $d = int($sf/36000);
  $sf %= 10;
  return sprintf("%d.%02d.%02d.%01d", $d, $m, $s, $sf);
}

sub gdms2deg { # 経緯度、GPSy形式 -> 度
  my($d) = @_;
  $d =~ /(-?)(\d*\.?\d*)。?(\d*\.?\d*)'?(\d*\.?\d*)"?/ || die;
  return ($1 ? -1 : 1) * ($2 + $3/60 + $4/3600);
}