mirror of
				https://github.com/cclassic/model-ghdl
				synced 2025-11-04 02:49:33 +01:00 
			
		
		
		
	Removed fgets when parsing process output as it failed on multiline-stuff
This commit is contained in:
		
							
								
								
									
										36
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								main.c
									
									
									
									
									
								
							@@ -78,10 +78,11 @@ int run_ghdl(char *command, ...) {
 | 
				
			|||||||
    char buf[1 K];
 | 
					    char buf[1 K];
 | 
				
			||||||
    char cmd[1 K];
 | 
					    char cmd[1 K];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    char *arr[4];
 | 
					    char *arr[5];
 | 
				
			||||||
    char *start;
 | 
					    char *start;
 | 
				
			||||||
    char *ptr;
 | 
					    char *ptr;
 | 
				
			||||||
    int arrc;
 | 
					    int arrc;
 | 
				
			||||||
 | 
					    int fgetret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    va_list argptr;
 | 
					    va_list argptr;
 | 
				
			||||||
    va_start(argptr, command);
 | 
					    va_start(argptr, command);
 | 
				
			||||||
@@ -101,28 +102,47 @@ int run_ghdl(char *command, ...) {
 | 
				
			|||||||
    //                            v
 | 
					    //                            v
 | 
				
			||||||
    // ** Error: /tmp/filename.vhd(32): (vcom-1136) Unknown identifier "counter_i2".
 | 
					    // ** Error: /tmp/filename.vhd(32): (vcom-1136) Unknown identifier "counter_i2".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while(fgets(buf, sizeof(buf), proc)!=NULL){
 | 
					    while(42){
 | 
				
			||||||
 | 
					        ptr = buf - 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        do { // TODO: Overflow protection!
 | 
				
			||||||
 | 
					            ptr++;
 | 
				
			||||||
 | 
					            *ptr = fgetc(proc);
 | 
				
			||||||
 | 
					        } while (*ptr != '\0' && *ptr != '\n' && *ptr != -1);
 | 
				
			||||||
 | 
					        if (*ptr == -1)
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        *ptr = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ptr = buf;
 | 
					        ptr = buf;
 | 
				
			||||||
        start = buf;
 | 
					        start = buf;
 | 
				
			||||||
        arrc = 0;
 | 
					        arrc = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        do { // Search for EOL
 | 
					        do { // Split into params
 | 
				
			||||||
            if (arrc < 5 && (*ptr == ':' || *ptr == '\0')) {
 | 
					            if (*ptr == '(') {
 | 
				
			||||||
                *ptr++ = 0;
 | 
					 | 
				
			||||||
                arr[arrc++] = start;
 | 
					                arr[arrc++] = start;
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (arrc < 5 && (*ptr == ':' || *ptr == '\0')) {
 | 
				
			||||||
 | 
					                arr[arrc++] = start;
 | 
				
			||||||
 | 
					                if (*ptr == '\0')
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                    *ptr++ = 0;
 | 
				
			||||||
                start = ptr;
 | 
					                start = ptr;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } while (*ptr++ != '\0');
 | 
					        } while (*ptr++ != '\0');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (arrc == 4) {
 | 
					        if (arrc == 4) {
 | 
				
			||||||
            printf("** Error: %s(%s): (ghdl) %s", arr[0], arr[1], arr[3]);
 | 
					            printf("** Error: %s(%s): (ghdl) %s\n", arr[0], arr[1], arr[3]);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else if (arrc == 5) {
 | 
					        else if (arrc == 5) {
 | 
				
			||||||
            printf("** Warning: %s(%s): (ghdl) %s", arr[0], arr[1], arr[4]);
 | 
					            printf("** Warning: %s(%s): (ghdl) %s\n", arr[0], arr[1], arr[4]);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else {
 | 
					        else {
 | 
				
			||||||
            printf("** ghdl: %s", buf);
 | 
					            printf("** ghdl: %s\n", buf);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        fflush(stdout);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    printf("\n");
 | 
					    printf("\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user