tdaq-develop-2025-02-12
doxygen_main_editor.cpp
1 #include <arpa/inet.h>
22 #include <errno.h>
23 #include <netdb.h>
24 #include <netinet/in.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <sys/socket.h>
29 #include <sys/types.h>
30 #include <unistd.h>
31 #include <iomanip>
32 #include <iostream>
33 
35 #define __PRINTF__ printf
36 
37 #define __MF_SUBJECT__ "doxy_main"
38 
39 #define __SHORTFILE__ \
40  (__builtin_strstr(&__FILE__[0], "/srcs/") \
41  ? __builtin_strstr(&__FILE__[0], "/srcs/") + 6 \
42  : __FILE__)
43 #define __COUT_HDR_L__ "[" << std::dec << __LINE__ << " |\t"
44 #define __COUT_HDR_FL__ __SHORTFILE__ << " " << __COUT_HDR_L__
45 
46 #define __COUT_TYPE__(X) std::cout << QUOTE(X) << ":"
47 #define __COUT_ERR__ __COUT_TYPE__(LogError) << __COUT_HDR_FL__
48 #define __COUT_WARN__ __COUT_TYPE__(LogWarning) << __COUT_HDR_FL__
49 #define __COUT_INFO__ __COUT_TYPE__(LogInfo) << __COUT_HDR_FL__
50 #define __COUT__ __COUT_TYPE__(LogDebug) << __COUT_HDR_FL__
51 
52 #define __SS__ \
53  std::stringstream ss; \
54  ss << "|" << __MF_DECOR__ << ": " << __COUT_HDR_FL__
55 #define __SS_THROW__ \
56  { \
57  __COUT_ERR__ << "\n" << ss.str(); \
58  throw std::runtime_error(ss.str()); \
59  } //put in {}'s to prevent surprises, e.g. if ... else __SS_THROW__;
60 #define __E__ std::endl
61 #define Q(X) #X
62 #define QUOTE(X) Q(X)
63 #define __COUTV__(X) __COUT__ << QUOTE(X) << " = " << X << __E__
64 
69 int main(int argc, char** argv)
70 {
71  __COUT__ << "Starting doxygen main.html editor..." << __E__;
72 
73  if(argc < 4)
74  {
75  __COUT__ << "Need 3 arguments: for the full path to main.html AND to "
76  "ARRAY:<html-to-inject>"
77  << __E__;
78  return 0;
79  }
80  std::string mainfn = argv[1];
81  std::string injectfn = argv[2];
82  std::string inject2fn = argv[3];
83  __COUT__ << "main.html destination full path: " << mainfn << __E__;
84  __COUT__ << "main.html source full path: " << mainfn + ".bk" << __E__;
85  __COUT__ << "inject.html source full path: " << injectfn << __E__;
86  __COUT__ << "inject2.html source full path: " << inject2fn << __E__;
87 
88  FILE* mainSrc = fopen((mainfn + ".bk").c_str(), "r");
89  if(!mainSrc)
90  {
91  __COUT__ << "Failed to open... " << mainfn + ".bk" << __E__;
92  return 0;
93  }
94  FILE* injectSrc = fopen((injectfn).c_str(), "r");
95  if(!injectSrc)
96  {
97  __COUT__ << "Failed to open... " << injectfn << __E__;
98  return 0;
99  }
100  FILE* inject2Src = fopen((inject2fn).c_str(), "r");
101  if(!inject2Src)
102  {
103  __COUT__ << "Failed to open... " << inject2fn << __E__;
104  return 0;
105  }
106  FILE* mainDest = fopen((mainfn).c_str(), "w");
107  if(!mainSrc)
108  {
109  __COUT__ << "Failed to open... " << mainfn << __E__;
110  return 0;
111  }
112 
113  char line[1000];
114  unsigned int countdown = -1;
115 
116  unsigned int injectIndex = 0;
117 
118  bool injected = true;
119  while(fgets(line, 1000, mainSrc))
120  {
121  fputs(line, mainDest); // output main line to file
122  __COUT__ << line << (line[strlen(line) - 1] == '\n' ? "" : "\n");
123 
124  if(injected && !strcmp(line, "<div class=\"contents\">\n"))
125  {
126  injected = false;
127  countdown = 0;
128  injectIndex = 1;
129  // continue;
130  }
131  else if(injected && !strcmp(line, "<head>\n"))
132  {
133  injected = false;
134  countdown = 0;
135  injectIndex = 2;
136  // continue;
137  }
138 
139  if(!injected && countdown == 0) // inject file
140  {
141  injected = true;
142 
143  switch(injectIndex)
144  {
145  case 1: {
146  // get one more line and modify it, ie, clip ugly start and delete close
147  // tag for content div fgets(line,1000,mainSrc);
148  // __COUT__ << "MOD " << line << (line[strlen(line)-1] ==
149  //'\n'?"":"\n"); line[strlen(line)-7] = '\0';
150  // for(countdown=strlen(line)-16;countdown<strlen(line);++countdown)
151  // if(line[countdown]=='v') break;
152  //
153  // //keep version number
154  // fputs("<h3>",mainDest);
155  // __COUT__ << "<h3>" << __E__;
156  // fputs(&line[countdown],mainDest); //output main line to
157  // file
158  // __COUT__ << &line[countdown] << __E__;
159 
160  while(fgets(line, 1000, injectSrc))
161  {
162  fputs(line, mainDest); // output inject line to file
163  __COUT__ << line << (line[strlen(line) - 1] == '\n' ? "" : "\n");
164  }
165 
166  // add close content div
167  // fputs("</div>",mainDest);
168  // __COUT__ << "</div>" << __E__;
169 
170  break;
171  }
172  case 2: {
173  while(fgets(line, 1000, inject2Src))
174  {
175  fputs(line, mainDest); // output inject line to file
176  __COUT__ << line << (line[strlen(line) - 1] == '\n' ? "" : "\n");
177  }
178  break;
179  }
180  default:
181  __COUT__ << "Unknown injection!" << __E__;
182  }
183  }
184  else if(!injected)
185  {
186  --countdown;
187  }
188  }
189 
190  fclose(mainDest);
191  fclose(injectSrc);
192  fclose(mainSrc);
193 
194  __COUT__ << "Doxygen main.html editor complete!" << __E__;
195 
196  return 0;
197 }