package zap;

import java.util.*;
import java.util.regex.*;
import java.io.*;
import java.lang.StringBuffer;

public class MaskFind {
  private String fileName;
  private String inMask;
  private String mask;
  private Scanner scanner;
  private Pattern pattern;
  private BufferedReader reader;
  
    
  public MaskFind(String mask, String fileName) {
    this.fileName = fileName;
    this.inMask = mask;
  }
  
  
  /**
   * Hlavní metoda
   */
  public void process() {
    if (!openFile()) return;
    
    mask = "^"+maskTranslate(inMask)+"$";
    
    System.out.println("mask : "+inMask);
    System.out.println("regex: "+mask);

    pattern = Pattern.compile(mask);
    
    boolean maskFirst = inMask.startsWith("<");
    boolean maskLast = inMask.endsWith(">");
    
    mask = "^"+mask+"$";

    String word;
    int line = 0;
    String tx;
    boolean firstWord;
    
    try {
      // bereme radek po radku
      while ((tx = reader.readLine()) != null) {
        line++;
        firstWord = true;

        scanner = new Scanner(tx);
        
        // bereme slovo za slovem na aktualnim radku
        while (scanner.hasNext()) {
          word = scanner.next();
          
          if (maskFirst && !firstWord) {
            // preskocit, neni to prvni slovo na radku
          }
          else if (maskLast && scanner.hasNext()) {
            // preskocit, neni to posledni slovo na radku
          }
          else if (wordMatch(word))
            System.out.println(line+": "+word);
          
          firstWord = false;
        }

      }
    }
    catch (Exception e) {
      System.out.println("I/O error: "+fileName);
      return;
    }
    
  }
    
    
  /**
   * Otevře soubor
   */
  private boolean openFile() {
    try {
      reader = new BufferedReader(new FileReader(fileName));
    }
    catch (IOException e) {
      System.out.println("Unable to open file: "+fileName);
      return false;
    }
    
    return true;
  }
  
  
  /**
   * Matchuje jedno slovo
   */
  private boolean wordMatch(String word) {
    Matcher matcher = pattern.matcher(word);
    if (matcher.find()) return true;
    return false;
  }
  
  
  /**
   * Přeloľí masku do regexp výrazu
   */
  private String maskTranslate(String mask) {
    boolean bslash = false;
    int i;
    StringBuffer buf = new StringBuffer();
    
    char[] chars = mask.toCharArray();
    
    for (i=0; i < chars.length; i++) {
      if (bslash) {
        bslash = false;
        buf.append(chars[i]);
        continue;
      }
      
      switch (chars[i]) {
        case '*':
          buf.append(".*");
          break;

        case '?':
          buf.append(".?");
          break;

        case '#':
          buf.append("[0123456789]");
          break;

        case '<':
          break;
          
        case '>':
          break;
          
        case '^':
          buf.append("\\^");
          break;
          
        case '$':
          buf.append("\\$");
          break;
          
        case '\\':
          buf.append("\\");
          bslash = true;
          break;
          
        default:
          buf.append(chars[i]);
          break;
      }
    }
    
    return buf.toString();
  }
    
    
  public static void main(String[] args) {
    if (args.length != 2) {
      System.out.println("MaskFind <maska> <soubor>");
      System.exit(1);
    }
        
    MaskFind mf = new MaskFind(args[0],args[1]);
    mf.process();
  }
    
}