1 /* contrib/mips-msa/linux.c
2  *
3  * Copyright (c) 2016 Glenn Randers-Pehrson
4  * Written by Mandar Sahastrabuddhe, 2016.
5  * Last changed in libpng 1.6.25beta03 [August 29, 2016]
6  *
7  * This code is released under the libpng license.
8  * For conditions of distribution and use, see the disclaimer
9  * and license in png.h
10  *
11  * SEE contrib/mips-msa/README before reporting bugs
12  *
13  * STATUS: SUPPORTED
14  * BUG REPORTS: png-mng-implement@sourceforge.net
15  *
16  * png_have_msa implemented for Linux by reading the widely available
17  * pseudo-file /proc/cpuinfo.
18  *
19  * This code is strict ANSI-C and is probably moderately portable; it does
20  * however use <stdio.h> and it assumes that /proc/cpuinfo is never localized.
21  */
22 
23 #include <stdio.h>
24 #include <string.h>
25 #include <stdlib.h>
26 
27 static int
png_have_msa(png_structp png_ptr)28 png_have_msa(png_structp png_ptr)
29 {
30    FILE *f = fopen("/proc/cpuinfo", "rb");
31 
32    char *string = "msa";
33    char word[10];
34 
35    if (f != NULL)
36    {
37       while(!feof(f))
38       {
39          int ch = fgetc(f);
40          static int i = 0;
41 
42          while(!(ch <= 32))
43          {
44             word[i++] = ch;
45             ch = fgetc(f);
46          }
47 
48          int val = strcmp(string, word);
49 
50          if (val == 0)
51             return 1;
52 
53          i = 0;
54          memset(word, 0, 10);
55       }
56 
57       fclose(f);
58    }
59 #ifdef PNG_WARNINGS_SUPPORTED
60    else
61       png_warning(png_ptr, "/proc/cpuinfo open failed");
62 #endif
63    return 0;
64 }
65