cjson.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. from __future__ import print_function
  2. import sys
  3. import os
  4. sys.path.extend(['.', '..'])
  5. from pycparser import parse_file, c_ast
  6. from Queue import Queue
  7. from threading import Thread
  8. import files
  9. class Worker (Thread):
  10. """Thread executing tasks from a given tasks queue"""
  11. def __init__ (self, tasks):
  12. Thread.__init__(self)
  13. self.tasks = tasks
  14. self.daemon = True
  15. self.start()
  16. def run (self):
  17. while True:
  18. func, args, kargs = self.tasks.get()
  19. try: func(*args, **kargs)
  20. except Exception as e:
  21. print(e)
  22. self.tasks.task_done()
  23. class ThreadPool:
  24. """Pool of threads consuming tasks from a queue"""
  25. def __init__ (self, num_threads):
  26. self.tasks = Queue(num_threads)
  27. for _ in range(num_threads): Worker(self.tasks)
  28. def add_task (self, func, *args, **kargs):
  29. """Add a task to the queue"""
  30. self.tasks.put((func, args, kargs))
  31. def wait_completion (self):
  32. """Wait for completion of all the tasks in the queue"""
  33. self.tasks.join()
  34. def processFile (filename):
  35. ast = parse_file(filename, use_cpp=True,
  36. cpp_path='gcc',
  37. cpp_args=['-E', r'-Iutils/fake_libc_include'])
  38. funcDefList = [node for (_, node) in ast.children() if node.__class__.__name__ is 'FuncDef' or node.__class__.__name__ is 'Def']
  39. print("> AST size: %d" % len(funcDefList))
  40. def processStudentData (studentData, assignment):
  41. print("Processing data from student %s at assignment %s" %(studentData[0], assignment))
  42. try:
  43. processFile(studentData[1])
  44. except:
  45. print("> failed to process file: %s" % studentData[1])
  46. def loadStudentsFolders (raiz, folder):
  47. userDataPath = os.path.join(raiz, folder)
  48. return files.filesFromFolder(userDataPath, "usersdata")
  49. def loadStudentFiles (raiz, folder, studentsFolders):
  50. studentsData = []
  51. for s in studentsFolders:
  52. path = os.path.join(raiz, folder, "usersdata", s)
  53. finalFolder = files.highestFileName(path)
  54. cFileFolder = os.path.join(path, finalFolder, "submittedfiles")
  55. cFiles = files.getFilesInFolder(cFileFolder, "*[cC]*")
  56. if len(cFiles) == 0:
  57. studentsData.append((s, ""))
  58. else:
  59. studentsData.append((s, cFiles[0]))
  60. return studentsData
  61. def loadAssignments (raiz):
  62. assignmentsFolders = files.filesFromFolder(raiz, "")
  63. assignments = {}
  64. for a in assignmentsFolders:
  65. studentsFolders = loadStudentsFolders(raiz, a)
  66. if(len(studentsFolders) == 0):
  67. assignments[a] = []
  68. continue
  69. studentsData = loadStudentFiles(raiz, a, studentsFolders)
  70. assignments[a] = studentsData
  71. return assignments
  72. #--- run ---#
  73. if __name__ == "__main__":
  74. if len(sys.argv) > 1:
  75. raiz = "./" + sys.argv[1]
  76. data = loadAssignments(raiz)
  77. pool = ThreadPool(10)
  78. for a in data:
  79. for studentData in data[a]:
  80. pool.add_task(processStudentData, studentData, a)
  81. pool.wait_completion()
  82. print("waiting")
  83. # assigments = files.filesFromFolder(raiz, "")
  84. # for a in assigments:
  85. # userDataPath = os.path.join(raiz, a)
  86. # students = files.filesFromFolder(userDataPath, "usersdata")
  87. # if len(students) == 0:
  88. # continue
  89. # for s in students:
  90. # path = os.path.join(userDataPath, "usersdata", s)
  91. # finalFolder = files.highestFileName(path)
  92. # cFileFolder = os.path.join(path, finalFolder, "submittedfiles")
  93. # cFiles = files.getFilesInFolder(cFileFolder, "*.c")
  94. # for i in cFiles:
  95. # print(i)
  96. # pool = ThreadPool(20)
  97. # for file in inputs:
  98. # pool.add_task(processFile, file)
  99. # pool.wait_completion()
  100. else:
  101. print("No filename")