#! /usr/bin/python2
import os.path
import sys
import shlex
import re

from headerutils import *



usage = False
src = list()
flist = { }
process_h = False
process_c = False
verbose = False
level = 0
match_all = False
num_match = 1

file_list = list()
current = True
deeper = True
scanfiles = True
for x in sys.argv[1:]:
  if x[0:2] == "-h":
    usage = True
  elif x[0:2] == "-i":
    process_h = True
  elif x[0:2] == "-s" or x[0:2] == "-c":
    process_c = True
  elif x[0:2] == "-v":
    verbose = True
  elif x[0:2] == "-a":
    match_all = True
  elif x[0:2] == "-n":
    num_match = int(x[2:])
  elif x[0:2] == "-1":
    deeper = False
  elif x[0:2] == "-2":
    current = False
  elif x[0:2] == "-f":
    file_list = open (x[2:]).read().splitlines()
    scanfiles = False
  elif x[0] == "-":
    print "Error: Unknown option " + x
    usage = True
  else:
    src.append (x)

if match_all:
  num_match = len (src)

if not process_h and not process_c:
  process_h = True
  process_c = True

if len(src) == 0:
  usage = True

if not usage:
  if scanfiles:
    if process_h:
      file_list = find_gcc_files ("\*.h", current, deeper)
    if process_c:
      file_list = file_list + find_gcc_files ("\*.c", current, deeper)
      file_list = file_list + find_gcc_files ("\*.cc", current, deeper)
  else:
    newlist = list()
    for x in file_list:
      if process_h and x[-2:] == ".h":
        newlist.append (x)
      elif process_c and (x[-2:] == ".c" or x[-3:] == ".cc"):
        newlist.append (x)
    file_list = newlist;
     
  file_list.sort()
  for fn in file_list:
    found = find_unique_include_list (fn)
    careabout = list()
    output = ""
    for inc in found:
      if inc in src:
        careabout.append (inc)
        if output == "":
          output = fn
        if verbose:
          output = output + " [" + inc +"]"
    if len (careabout) < num_match:
        output = ""
    if output != "":
      print output
else:
  print "included-by [-h] [-i] [-c] [-v] [-a] [-nx] file1 [file2] ... [filen]"
  print "find the list of all files in subdirectories that include any of "
  print "the listed files. processed to a depth of 3 subdirs"
  print " -h  : Show this message"
  print " -i  : process only header files (*.h) for #include"
  print " -c  : process only source files (*.c *.cc) for #include"
  print "       If nothing is specified, defaults to -i -c"
  print " -s  : Same as -c."
  print " -v  : Show which include(s) were found"
  print " -nx : Only list files which have at least x different matches. Default = 1"
  print " -a  : Show only files which all listed files are included"
  print "       This is equivilent to -nT where T == # of items in list"
  print " -flistfile  : Show only files contained in the list of files"

 




