// File: iZhangHui[P]CppPrimer/CH12_DynamicMemory/exercises/ex12_28.cc
// Function: main
int main(int argc, char const *argv[])
{
	ifstream infile;
	vector<string> file;
	map<string, set<decltype(file.size())>> wm;

	// Test data CH12_DynamicMemory/examples/data/storyDataFile
	if (argc < 2 || !(infile.open(argv[1]), infile)) {
		cerr << "No input file!" << endl;
		return EXIT_FAILURE;
	}

	string text;
	while (getline(infile, text)) {
		file.push_back(text);
		istringstream line(text);
		string str;
		while (line >> str) {
			string word;
			remove_copy_if(str.cbegin(), str.cend(), back_inserter(word), ispunct);
			wm[word].insert(file.size());
		}
	}

	while (true) {
		cout << "enter word to look for, or q to quite: ";
		string s;

		if (!(cin >> s) || s == "q")
			break;

		auto found = wm.find(s);
		if (found != wm.end()) {
			cout << s << " occurs " << found->second.size() << "time(s)" << endl;
			for (auto num : found->second) {
				cout << "\t(line " << num  << ") " << file[num - 1] << endl;
			}
		} else {
			cout << s << " occurs 0 time" << endl;
		}
	}
	return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x5b0, %rsp            # imm = 0x5B0
movl $0x0, -0x4(%rbp)
movl %edi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
leaq -0x218(%rbp), %rdi
callq 0x2200
leaq -0x230(%rbp), %rdi
callq 0x2b20
leaq -0x260(%rbp), %rdi
callq 0x2b40
cmpl $0x2, -0x8(%rbp)
jl 0x246a
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rsi
leaq -0x218(%rbp), %rdi
movl $0x8, %edx
callq 0x2150
jmp 0x243e
movq -0x218(%rbp), %rax
movq -0x18(%rax), %rax
leaq -0x218(%rbp,%rax), %rdi
callq 0x20f0
movb %al, -0x4d9(%rbp)
jmp 0x245e
movb -0x4d9(%rbp), %al
testb $0x1, %al
jne 0x246a
jmp 0x24c8
movq 0x7b7f(%rip), %rdi      # 0x9ff0
leaq 0x3b8c(%rip), %rsi      # 0x6004
callq 0x21b0
movq %rax, -0x4e8(%rbp)
jmp 0x2486
movq -0x4e8(%rbp), %rdi
movq 0x7b1c(%rip), %rsi      # 0x9fb0
callq 0x21f0
jmp 0x249b
movl $0x1, -0x4(%rbp)
movl $0x1, -0x270(%rbp)
jmp 0x2aba
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x268(%rbp)
movl %eax, -0x26c(%rbp)
jmp 0x2aea
leaq -0x290(%rbp), %rdi
callq 0x2240
leaq -0x218(%rbp), %rdi
leaq -0x290(%rbp), %rsi
callq 0x2050
movq %rax, -0x4f0(%rbp)
jmp 0x24f0
movq -0x4f0(%rbp), %rdi
movq (%rdi), %rax
movq -0x18(%rax), %rax
addq %rax, %rdi
callq 0x2220
movb %al, -0x4f1(%rbp)
jmp 0x250e
movb -0x4f1(%rbp), %al
testb $0x1, %al
jne 0x251d
jmp 0x273d
leaq -0x230(%rbp), %rdi
leaq -0x290(%rbp), %rsi
callq 0x2b60
jmp 0x2532
leaq -0x410(%rbp), %rdi
leaq -0x290(%rbp), %rsi
movl $0x8, %edx
callq 0x2280
jmp 0x254c
leaq -0x430(%rbp), %rdi
callq 0x2240
leaq -0x410(%rbp), %rdi
leaq -0x430(%rbp), %rsi
callq 0x2230
movq %rax, -0x500(%rbp)
jmp 0x2574
movq -0x500(%rbp), %rdi
movq (%rdi), %rax
movq -0x18(%rax), %rax
addq %rax, %rdi
callq 0x2220
movb %al, -0x501(%rbp)
jmp 0x2592
movb -0x501(%rbp), %al
testb $0x1, %al
jne 0x25a1
jmp 0x2703
leaq -0x450(%rbp), %rdi
movq %rdi, -0x518(%rbp)
callq 0x2240
leaq -0x430(%rbp), %rdi
movq %rdi, -0x520(%rbp)
callq 0x20d0
movq -0x520(%rbp), %rdi
movq %rax, -0x458(%rbp)
callq 0x2060
movq -0x518(%rbp), %rdi
movq %rax, -0x460(%rbp)
callq 0x2c30
movq %rax, -0x510(%rbp)
jmp 0x25f6
movq -0x510(%rbp), %rax
movq %rax, -0x468(%rbp)
movq -0x458(%rbp), %rdi
movq -0x460(%rbp), %rsi
movq -0x468(%rbp), %rdx
movq 0x79c8(%rip), %rcx      # 0x9fe8
callq 0x2bd0
movq %rax, -0x528(%rbp)
jmp 0x262e
movq -0x528(%rbp), %rax
movq %rax, -0x470(%rbp)
leaq -0x260(%rbp), %rdi
leaq -0x450(%rbp), %rsi
callq 0x2c60
movq %rax, -0x530(%rbp)
jmp 0x2658
leaq -0x230(%rbp), %rdi
callq 0x2d90
movq -0x530(%rbp), %rdi
movq %rax, -0x478(%rbp)
leaq -0x478(%rbp), %rsi
callq 0x2d40
movb %dl, -0x539(%rbp)
movq %rax, -0x538(%rbp)
jmp 0x268d
movb -0x539(%rbp), %al
movq -0x538(%rbp), %rcx
movq %rcx, -0x488(%rbp)
movb %al, -0x480(%rbp)
leaq -0x450(%rbp), %rdi
callq 0x2140
jmp 0x2558
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x268(%rbp)
movl %eax, -0x26c(%rbp)
jmp 0x2aac
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x268(%rbp)
movl %eax, -0x26c(%rbp)
jmp 0x2720
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x268(%rbp)
movl %eax, -0x26c(%rbp)
leaq -0x450(%rbp), %rdi
callq 0x2140
jmp 0x2720
leaq -0x430(%rbp), %rdi
callq 0x2140
leaq -0x410(%rbp), %rdi
callq 0x2100
jmp 0x24d4
leaq -0x430(%rbp), %rdi
callq 0x2140
leaq -0x410(%rbp), %rdi
callq 0x2100
jmp 0x2aac
jmp 0x273f
jmp 0x2741
movq 0x7878(%rip), %rdi      # 0x9fc0
leaq 0x38c4(%rip), %rsi      # 0x6013
callq 0x21b0
jmp 0x2756
leaq -0x4a8(%rbp), %rdi
movq %rdi, -0x550(%rbp)
callq 0x2240
movq -0x550(%rbp), %rsi
movq 0x7859(%rip), %rdi      # 0x9fd0
callq 0x2230
movq %rax, -0x548(%rbp)
jmp 0x2785
movq -0x548(%rbp), %rdi
movq (%rdi), %rax
movq -0x18(%rax), %rax
addq %rax, %rdi
callq 0x20f0
movb %al, -0x551(%rbp)
jmp 0x27a3
movb -0x551(%rbp), %al
testb $0x1, %al
jne 0x27d6
jmp 0x27af
leaq 0x3885(%rip), %rsi      # 0x603b
leaq -0x4a8(%rbp), %rdi
callq 0x2db0
movb %al, -0x552(%rbp)
jmp 0x27ca
movb -0x552(%rbp), %al
testb $0x1, %al
jne 0x27d6
jmp 0x2808
movl $0x7, -0x270(%rbp)
jmp 0x2a6e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x268(%rbp)
movl %eax, -0x26c(%rbp)
leaq -0x4a8(%rbp), %rdi
callq 0x2140
jmp 0x2aac
leaq -0x260(%rbp), %rdi
leaq -0x4a8(%rbp), %rsi
callq 0x2de0
movq %rax, -0x560(%rbp)
jmp 0x2824
movq -0x560(%rbp), %rax
movq %rax, -0x4b0(%rbp)
leaq -0x260(%rbp), %rdi
callq 0x2e40
movq %rax, -0x4b8(%rbp)
leaq -0x4b0(%rbp), %rdi
leaq -0x4b8(%rbp), %rsi
callq 0x2e10
testb $0x1, %al
jne 0x2861
jmp 0x2a15
movq 0x7758(%rip), %rdi      # 0x9fc0
leaq -0x4a8(%rbp), %rsi
callq 0x21a0
movq %rax, -0x568(%rbp)
jmp 0x287d
movq -0x568(%rbp), %rdi
leaq 0x37b2(%rip), %rsi      # 0x603d
callq 0x21b0
movq %rax, -0x570(%rbp)
jmp 0x2899
leaq -0x4b0(%rbp), %rdi
callq 0x2e70
movq %rax, %rdi
addq $0x20, %rdi
callq 0x2e90
movq -0x570(%rbp), %rdi
movq %rax, %rsi
callq 0x2070
movq %rax, -0x578(%rbp)
jmp 0x28c9
movq -0x578(%rbp), %rdi
leaq 0x376f(%rip), %rsi      # 0x6046
callq 0x21b0
movq %rax, -0x580(%rbp)
jmp 0x28e5
movq -0x580(%rbp), %rdi
movq 0x76bd(%rip), %rsi      # 0x9fb0
callq 0x21f0
jmp 0x28fa
leaq -0x4b0(%rbp), %rdi
callq 0x2e70
addq $0x20, %rax
movq %rax, -0x4c0(%rbp)
movq -0x4c0(%rbp), %rdi
callq 0x2eb0
movq %rax, -0x4c8(%rbp)
movq -0x4c0(%rbp), %rdi
callq 0x2ee0
movq %rax, -0x4d0(%rbp)
leaq -0x4c8(%rbp), %rdi
leaq -0x4d0(%rbp), %rsi
callq 0x2f10
testb $0x1, %al
jne 0x2953
jmp 0x2a13
leaq -0x4c8(%rbp), %rdi
callq 0x2f40
movq (%rax), %rax
movq %rax, -0x4d8(%rbp)
movq 0x7650(%rip), %rdi      # 0x9fc0
leaq 0x36d7(%rip), %rsi      # 0x604e
callq 0x21b0
movq %rax, -0x588(%rbp)
jmp 0x2985
movq -0x588(%rbp), %rdi
movq -0x4d8(%rbp), %rsi
callq 0x2070
movq %rax, -0x590(%rbp)
jmp 0x29a1
movq -0x590(%rbp), %rdi
leaq 0x36a7(%rip), %rsi      # 0x6056
callq 0x21b0
movq %rax, -0x598(%rbp)
jmp 0x29bd
movq -0x4d8(%rbp), %rsi
decq %rsi
leaq -0x230(%rbp), %rdi
callq 0x2f60
movq -0x598(%rbp), %rdi
movq %rax, %rsi
callq 0x21a0
movq %rax, -0x5a0(%rbp)
jmp 0x29eb
movq -0x5a0(%rbp), %rdi
movq 0x75b7(%rip), %rsi      # 0x9fb0
callq 0x21f0
jmp 0x2a00
jmp 0x2a02
leaq -0x4c8(%rbp), %rdi
callq 0x2f80
jmp 0x2937
jmp 0x2a64
movq 0x75a4(%rip), %rdi      # 0x9fc0
leaq -0x4a8(%rbp), %rsi
callq 0x21a0
movq %rax, -0x5a8(%rbp)
jmp 0x2a31
movq -0x5a8(%rbp), %rdi
leaq 0x361a(%rip), %rsi      # 0x6059
callq 0x21b0
movq %rax, -0x5b0(%rbp)
jmp 0x2a4d
movq -0x5b0(%rbp), %rdi
movq 0x7555(%rip), %rsi      # 0x9fb0
callq 0x21f0
jmp 0x2a62
jmp 0x2a64
movl $0x0, -0x270(%rbp)
leaq -0x4a8(%rbp), %rdi
callq 0x2140
movl -0x270(%rbp), %eax
testl %eax, %eax
je 0x2a88
jmp 0x2a86
jmp 0x2a8d
jmp 0x273f
movl $0x0, -0x4(%rbp)
movl $0x1, -0x270(%rbp)
leaq -0x290(%rbp), %rdi
callq 0x2140
jmp 0x2aba
leaq -0x290(%rbp), %rdi
callq 0x2140
jmp 0x2aea
leaq -0x260(%rbp), %rdi
callq 0x2fb0
leaq -0x230(%rbp), %rdi
callq 0x2fd0
leaq -0x218(%rbp), %rdi
callq 0x2080
movl -0x4(%rbp), %eax
addq $0x5b0, %rsp            # imm = 0x5B0
popq %rbp
retq
leaq -0x260(%rbp), %rdi
callq 0x2fb0
leaq -0x230(%rbp), %rdi
callq 0x2fd0
leaq -0x218(%rbp), %rdi
callq 0x2080
movq -0x268(%rbp), %rdi
callq 0x2290
nopw (%rax,%rax)