layers: Eliminate statically allocated strings

See suspicious crashes when debug layers are enabled.
Believe this is due to memory overruns with fixed size
string allocations. This patch makes most of the allocations
compute the space needed to eliminate overruns and show
as much of the debug info as possible.
Also uses strncpy and strncat to ensure strings stay within
the limits of the buffer.
diff --git a/xgl-helper.py b/xgl-helper.py
index cff1283..c98c288 100755
--- a/xgl-helper.py
+++ b/xgl-helper.py
@@ -495,6 +495,7 @@
                     stp_list.append(self.struct_dict[s][m])
                 struct_char_count += len(self.struct_dict[s][m]['name']) + 32
             sh_funcs.append('char* %s(const %s* pStruct, const char* prefix)\n{\n    char* str;\n' % (self._get_sh_func_name(s), typedef_fwd_dict[s]))
+            sh_funcs.append("    size_t len;\n")
             num_stps = len(stp_list);
             total_strlen_str = ''
             if 0 != num_stps:
@@ -509,38 +510,43 @@
                         sh_funcs.append('    if (pStruct->%s) {\n' % stp_list[index]['name'])
                         if 'pNext' == stp_list[index]['name']:
                             sh_funcs.append('        tmpStr = dynamic_display((XGL_VOID*)pStruct->pNext, prefix);\n')
-                            sh_funcs.append('        stp_strs[%i] = (char*)malloc(256+strlen(tmpStr));\n' % index)
+                            sh_funcs.append('        len = 256+strlen(tmpStr);\n')
+                            sh_funcs.append('        stp_strs[%i] = (char*)malloc(len);\n' % index)
                             if self.no_addr:
-                                sh_funcs.append('        sprintf(stp_strs[%i], "   %%spNext (addr)\\n%%s", prefix, tmpStr);\n' % index)
+                                sh_funcs.append('        snprintf(stp_strs[%i], len, "   %%spNext (addr)\\n%%s", prefix, tmpStr);\n' % index)
                             else:
-                                sh_funcs.append('        sprintf(stp_strs[%i], "   %%spNext (%%p)\\n%%s", prefix, (void*)pStruct->pNext, tmpStr);\n' % index)
+                                sh_funcs.append('        snprintf(stp_strs[%i], len, "   %%spNext (%%p)\\n%%s", prefix, (void*)pStruct->pNext, tmpStr);\n' % index)
                             sh_funcs.append('        free(tmpStr);\n')
                         else:
                             sh_funcs.append('        tmpStr = %s(pStruct->%s, extra_indent);\n' % (self._get_sh_func_name(stp_list[index]['type']), stp_list[index]['name']))
-                            sh_funcs.append('        stp_strs[%i] = (char*)malloc(256+strlen(tmpStr)+strlen(prefix));\n' % (index))
+                            sh_funcs.append('        len = 256+strlen(tmpStr)+strlen(prefix);\n')
+                            sh_funcs.append('        stp_strs[%i] = (char*)malloc(len);\n' % (index))
                             if self.no_addr:
-                                sh_funcs.append('        sprintf(stp_strs[%i], " %%s%s (addr)\\n%%s", prefix, tmpStr);\n' % (index, stp_list[index]['name']))
+                                sh_funcs.append('        snprintf(stp_strs[%i], len, " %%s%s (addr)\\n%%s", prefix, tmpStr);\n' % (index, stp_list[index]['name']))
                             else:
-                                sh_funcs.append('        sprintf(stp_strs[%i], " %%s%s (%%p)\\n%%s", prefix, (void*)pStruct->%s, tmpStr);\n' % (index, stp_list[index]['name'], stp_list[index]['name']))
+                                sh_funcs.append('        snprintf(stp_strs[%i], len, " %%s%s (%%p)\\n%%s", prefix, (void*)pStruct->%s, tmpStr);\n' % (index, stp_list[index]['name'], stp_list[index]['name']))
                         sh_funcs.append('    }\n')
                         sh_funcs.append("    else\n        stp_strs[%i] = &dummy_char;\n" % (index))
                     elif stp_list[index]['array']: # TODO : For now just printing first element of array
                         sh_funcs.append('    tmpStr = %s(&pStruct->%s[0], extra_indent);\n' % (self._get_sh_func_name(stp_list[index]['type']), stp_list[index]['name']))
-                        sh_funcs.append('    stp_strs[%i] = (char*)malloc(256+strlen(tmpStr));\n' % (index))
+                        sh_funcs.append('    len = 256+strlen(tmpStr);\n')
+                        sh_funcs.append('    stp_strs[%i] = (char*)malloc(len);\n' % (index))
                         if self.no_addr:
-                            sh_funcs.append('    sprintf(stp_strs[%i], " %%s%s[0] (addr)\\n%%s", prefix, tmpStr);\n' % (index, stp_list[index]['name']))
+                            sh_funcs.append('    snprintf(stp_strs[%i], len, " %%s%s[0] (addr)\\n%%s", prefix, tmpStr);\n' % (index, stp_list[index]['name']))
                         else:
-                            sh_funcs.append('    sprintf(stp_strs[%i], " %%s%s[0] (%%p)\\n%%s", prefix, (void*)&pStruct->%s[0], tmpStr);\n' % (index, stp_list[index]['name'], stp_list[index]['name']))
+                            sh_funcs.append('    snprintf(stp_strs[%i], len, " %%s%s[0] (%%p)\\n%%s", prefix, (void*)&pStruct->%s[0], tmpStr);\n' % (index, stp_list[index]['name'], stp_list[index]['name']))
                     else:
                         sh_funcs.append('    tmpStr = %s(&pStruct->%s, extra_indent);\n' % (self._get_sh_func_name(stp_list[index]['type']), stp_list[index]['name']))
-                        sh_funcs.append('    stp_strs[%i] = (char*)malloc(256+strlen(tmpStr));\n' % (index))
+                        sh_funcs.append('    len = 256+strlen(tmpStr);\n')
+                        sh_funcs.append('    stp_strs[%i] = (char*)malloc(len);\n' % (index))
                         if self.no_addr:
-                            sh_funcs.append('    sprintf(stp_strs[%i], " %%s%s (addr)\\n%%s", prefix, tmpStr);\n' % (index, stp_list[index]['name']))
+                            sh_funcs.append('    snprintf(stp_strs[%i], len, " %%s%s (addr)\\n%%s", prefix, tmpStr);\n' % (index, stp_list[index]['name']))
                         else:
-                            sh_funcs.append('    sprintf(stp_strs[%i], " %%s%s (%%p)\\n%%s", prefix, (void*)&pStruct->%s, tmpStr);\n' % (index, stp_list[index]['name'], stp_list[index]['name']))
+                            sh_funcs.append('    snprintf(stp_strs[%i], len, " %%s%s (%%p)\\n%%s", prefix, (void*)&pStruct->%s, tmpStr);\n' % (index, stp_list[index]['name'], stp_list[index]['name']))
                     total_strlen_str += 'strlen(stp_strs[%i]) + ' % index
-            sh_funcs.append('    str = (char*)malloc(%ssizeof(char)*1024);\n' % (total_strlen_str))
-            sh_funcs.append('    sprintf(str, "')
+            sh_funcs.append('    len = %ssizeof(char)*1024;\n' % (total_strlen_str))
+            sh_funcs.append('    str = (char*)malloc(len);\n')
+            sh_funcs.append('    snprintf(str, len, "')
             for m in sorted(self.struct_dict[s]):
                 (p_out1, p_args1) = self._get_struct_print_formatted(self.struct_dict[s][m])
                 p_out += p_out1